From 64536a3a3f12ab543332f262a1c0772f4e8e23a4 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 23 Jun 2015 18:06:43 -0700 Subject: [PATCH 01/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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 @@ - - - - - - - From a6ef9caefb33838e0e5c14438fbd506040c69fb7 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Sun, 19 Jul 2015 23:30:12 -0500 Subject: [PATCH 17/59] Removing unused undoChanges method. --- .../ui/prefs/SiteSettingsFragment.java | 19 ------------------- 1 file changed, 19 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 fd321807b10c..f8273dd79bb0 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 @@ -215,25 +215,6 @@ private HashMap generatePostParams() { return params; } - /** - * Reverts changed preferences - */ - 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(getLanguageString(mLanguagePreference.getValue(), Locale.getDefault()))) { - mLanguagePreference.setValue(mRemoteLanguage); - } - } - /** * Persists changed settings remotely */ From ef4b29ba1b01010ce5cd5ef825b2cdf7d4456d62 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Sun, 19 Jul 2015 23:45:24 -0500 Subject: [PATCH 18/59] Toasting and leaving Settings if no network is available. --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 5 +++++ 1 file changed, 5 insertions(+) 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 f8273dd79bb0..ecd9ba189e43 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 @@ -15,6 +15,7 @@ import org.wordpress.android.models.Blog; import org.wordpress.android.networking.RestClientUtils; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; import java.util.HashMap; @@ -45,6 +46,10 @@ public class SiteSettingsFragment extends PreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!NetworkUtils.checkConnection(getActivity())) { + getActivity().finish(); + } + // make sure we have local site data mBlog = WordPress.getBlog( getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); From ef633c696a61b1b9e6492469facd5be20a5101ac Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Sun, 19 Jul 2015 23:53:39 -0500 Subject: [PATCH 19/59] Moving preference initialization to onResume to avoid crash. --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 5 +++++ 1 file changed, 5 insertions(+) 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 ecd9ba189e43..cc4f00400568 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 @@ -57,6 +57,11 @@ public void onCreate(Bundle savedInstanceState) { // inflate Site Settings preferences from XML addPreferencesFromResource(R.xml.site_settings); + } + + @Override + public void onResume() { + super.onResume(); // set preference references, add change listeners, and setup various entries and values initPreferences(); From 048327c45848056a15f423dff6a2f793e46df5ca Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 28 Jul 2015 22:40:39 -0400 Subject: [PATCH 20/59] Title should be "Settings", no reference to blog title. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 6 ++---- 1 file changed, 2 insertions(+), 4 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 cc4f00400568..0cfa22c22af7 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 @@ -50,6 +50,8 @@ public void onCreate(Bundle savedInstanceState) { getActivity().finish(); } + getActivity().setTitle(R.string.settings); + // make sure we have local site data mBlog = WordPress.getBlog( getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); @@ -83,10 +85,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; 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) { From 7dbd896f3abace1eb232b6a4b5906bb3294b7cb3 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 28 Jul 2015 23:15:49 -0400 Subject: [PATCH 21/59] Changing display for privacy setting to match design. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 6 +++--- WordPress/src/main/res/values/strings.xml | 9 ++++++--- 2 files changed, 9 insertions(+), 6 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 0cfa22c22af7..1c6fdf6baebf 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 @@ -107,11 +107,11 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { private String privacyStringForValue(int value) { switch (value) { case -1: - return getString(R.string.site_privacy_private_desc); + return getString(R.string.privacy_private); case 0: - return getString(R.string.site_privacy_hidden_desc); + return getString(R.string.privacy_hidden); case 1: - return getString(R.string.site_privacy_public_desc); + return getString(R.string.privacy_public); default: return ""; } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index b41f252030b0..bc877a63cbb9 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -645,10 +645,13 @@ + Public + Hidden + Private - Public - Hidden - Private + @string/privacy_public + @string/privacy_hidden + @string/privacy_private From bc945f0d32e37eb3eb007ce416a42bb3c963bf8b Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 29 Jul 2015 00:24:47 -0400 Subject: [PATCH 22/59] Fixing language retrieval, saving, and display. --- .../ui/prefs/SiteSettingsFragment.java | 32 ++++++++++++++----- .../android/networking/RestClientUtils.java | 1 - 2 files changed, 24 insertions(+), 9 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 1c6fdf6baebf..11adf0901470 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 @@ -177,17 +177,33 @@ private void handleResponseToGeneralSettingsRequest(JSONObject response) { mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); - mRemoteLanguage = response.optString(RestClientUtils.SITE_LANGUAGE_KEY); - if (mLanguagePreference != null) { - changeLanguageValue(mRemoteLanguage); - mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); + JSONObject settingsObject = response.optJSONObject("settings"); + + if (settingsObject != null) { + mRemoteLanguage = convertLanguageId(settingsObject.optString("lang_id")); + if (mLanguagePreference != null) { + changeLanguageValue(mRemoteLanguage); + mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); + } + + mRemotePrivacy = settingsObject.optInt("blog_public"); + if (mPrivacyPreference != null) { + mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); + } + changePrivacyValue(mRemotePrivacy); } + } - mRemotePrivacy = response.optJSONObject("settings").optInt("blog_public"); - if (mPrivacyPreference != null) { - mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); + private String convertLanguageId(String id) { + if (id != null) { + for (String key : mLanguageCodes.keySet()) { + if (id.equals(mLanguageCodes.get(key))) { + return key; + } + } } - changePrivacyValue(mRemotePrivacy); + + return ""; } /** 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 2d2aab35949b..6b69fb60c5f4 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 @@ -226,7 +226,6 @@ public void getCurrentTheme(String siteId, Listener listener, ErrorListener erro public void getGeneralSettings(String siteId, Listener listener, ErrorListener errorListener) { String path = String.format("sites/%s/settings", siteId); Map params = new HashMap(); -// params.put("fields", "blogname,blogdescription,lang_id,blog_public"); get(path, params, null, listener, errorListener); } From d92f800abde6ef3aaf450f541200c33d7eaddec5 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 29 Jul 2015 11:44:00 -0400 Subject: [PATCH 23/59] Adding support for fetching self-hosted settings; title, tag, address --- .../ui/prefs/SiteSettingsFragment.java | 107 +++++++++++++----- 1 file changed, 78 insertions(+), 29 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 11adf0901470..6def5bdcf0be 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 @@ -16,10 +16,15 @@ import org.wordpress.android.networking.RestClientUtils; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.NetworkUtils; +import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; +import org.xmlrpc.android.XMLRPCCallback; +import org.xmlrpc.android.XMLRPCClientInterface; +import org.xmlrpc.android.XMLRPCFactory; import java.util.HashMap; import java.util.Locale; +import java.util.Map; /** * Handles changes to WordPress site settings. Syncs with host automatically when user leaves. @@ -146,28 +151,72 @@ private void changePrivacyValue(int 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) { - AppLog.w(AppLog.T.API, "Error GETing site settings: " + error); - if (isAdded()) { - ToastUtils.showToast(getActivity(), getString(R.string.error_fetch_remote_site_settings)); - getActivity().finish(); + if (mBlog.isDotcomFlag()) { + WordPress.getRestClientUtils().getGeneralSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + if (isAdded()) { + handleResponseToWPComSettingsRequest(response); + } + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + handleSettingsFetchError(error.toString()); } - } - }); + }); + } else { + // self-hosted settings + XMLRPCClientInterface client = XMLRPCFactory.instantiate(mBlog.getUri(), + mBlog.getHttpuser(), + mBlog.getHttppassword()); + Object[] params = { + mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() + }; + + client.callAsync(new XMLRPCCallback() { + @Override + public void onSuccess(long id, final Object result) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleResponseToSelfHostedSettingsRequest((HashMap>) result); + } + }); + } + + @Override + public void onFailure(long id, Exception error) { + handleSettingsFetchError(error.toString()); + } + }, "wp.getOptions", params); + } + } + + private void handleSettingsFetchError(String error) { + AppLog.w(AppLog.T.API, "Error GETing site settings: " + error); + if (isAdded()) { + ToastUtils.showToast(getActivity(), getString(R.string.error_fetch_remote_site_settings)); + getActivity().finish(); + } + } + + private void handleResponseToSelfHostedSettingsRequest(Map> result) { + mRemoteTitle = StringUtils.notNullStr(result.get("blog_title").get("value")); + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + + mRemoteTagline = StringUtils.notNullStr(result.get("blog_tagline").get("value")); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + + mRemoteAddress = StringUtils.notNullStr(result.get("blog_url").get("value")); + changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); } /** * Helper method to parse JSON response to REST request. */ - private void handleResponseToGeneralSettingsRequest(JSONObject response) { + private void handleResponseToWPComSettingsRequest(JSONObject response) { mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); @@ -180,7 +229,7 @@ private void handleResponseToGeneralSettingsRequest(JSONObject response) { JSONObject settingsObject = response.optJSONObject("settings"); if (settingsObject != null) { - mRemoteLanguage = convertLanguageId(settingsObject.optString("lang_id")); + mRemoteLanguage = convertLanguageIdToLanguageCode(settingsObject.optString("lang_id")); if (mLanguagePreference != null) { changeLanguageValue(mRemoteLanguage); mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); @@ -194,18 +243,6 @@ private void handleResponseToGeneralSettingsRequest(JSONObject response) { } } - private String convertLanguageId(String id) { - if (id != null) { - for (String key : mLanguageCodes.keySet()) { - if (id.equals(mLanguageCodes.get(key))) { - return key; - } - } - } - - return ""; - } - /** * Helper method to create the parameters for the site settings POST request */ @@ -339,4 +376,16 @@ private String getLanguageString(String languageCode, Locale displayLocale) { Locale languageLocale = new Locale(languageCode.substring(0, 2)); return languageLocale.getDisplayLanguage(displayLocale) + languageCode.substring(2); } + + private String convertLanguageIdToLanguageCode(String id) { + if (id != null) { + for (String key : mLanguageCodes.keySet()) { + if (id.equals(mLanguageCodes.get(key))) { + return key; + } + } + } + + return ""; + } } From 76e3d8ff5f70d4856f107b16b8031e0c43d1a10f Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 30 Jul 2015 11:30:47 -0400 Subject: [PATCH 24/59] Hiding unavailable settings for self-hosted sites and handling rotation. --- .../ui/prefs/BlogPreferencesActivity.java | 39 +++--- .../ui/prefs/SiteSettingsFragment.java | 132 ++++++++++++------ WordPress/src/main/res/values/strings.xml | 1 + WordPress/src/main/res/xml/site_settings.xml | 1 + 4 files changed, 113 insertions(+), 60 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 8734a732d5bc..f2bca4849b13 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,6 +1,7 @@ package org.wordpress.android.ui.prefs; import android.app.Fragment; +import android.app.FragmentManager; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -20,43 +21,41 @@ public class BlogPreferencesActivity extends AppCompatActivity { public static final String ARG_LOCAL_BLOG_ID = "local_blog_id"; public static final int RESULT_BLOG_REMOVED = RESULT_FIRST_USER; + private static final String KEY_SETTINGS_FRAGMENT = "settings-fragment"; + private static final String KEY_PASSCODE_FRAGMENT = "passcode-fragment"; + // The blog this activity is managing settings for. - private Blog blog; + private Blog mBlog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Integer id = getIntent().getIntExtra(ARG_LOCAL_BLOG_ID, -1); - blog = WordPress.getBlog(id); + mBlog = WordPress.getBlog(id); - if (blog == null) { + if (mBlog == null) { Toast.makeText(this, getString(R.string.blog_not_found), Toast.LENGTH_SHORT).show(); finish(); return; } - Fragment siteSettingsFragment = new SiteSettingsFragment(); - siteSettingsFragment.setArguments(getIntent().getExtras()); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, siteSettingsFragment) - .commit(); - + setTitle(R.string.settings); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setElevation(0.0f); - actionBar.setTitle(StringUtils.unescapeHTML(blog.getNameOrHostUrl())); actionBar.setDisplayHomeAsUpEnabled(true); } - } - @Override - public void setTitle(CharSequence title) { - super.setTitle(title); + FragmentManager fragmentManager = getFragmentManager(); + Fragment siteSettingsFragment = fragmentManager.findFragmentByTag(KEY_SETTINGS_FRAGMENT); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setTitle(title); + if (siteSettingsFragment == null) { + siteSettingsFragment = new SiteSettingsFragment(); + siteSettingsFragment.setArguments(getIntent().getExtras()); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, siteSettingsFragment, KEY_SETTINGS_FRAGMENT) + .commit(); } } @@ -70,10 +69,10 @@ public void finish() { protected void onPause() { super.onPause(); - WordPress.wpDB.saveBlog(blog); + WordPress.wpDB.saveBlog(mBlog); - if (WordPress.getCurrentBlog().getLocalTableBlogId() == blog.getLocalTableBlogId()) { - WordPress.currentBlog = blog; + if (WordPress.getCurrentBlog().getLocalTableBlogId() == mBlog.getLocalTableBlogId()) { + WordPress.currentBlog = mBlog; } } 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 6def5bdcf0be..07389f6cbf35 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 @@ -4,7 +4,9 @@ import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; +import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; +import android.support.annotation.NonNull; import com.android.volley.VolleyError; import com.wordpress.rest.RestRequest; @@ -15,8 +17,8 @@ import org.wordpress.android.models.Blog; import org.wordpress.android.networking.RestClientUtils; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.MapUtils; import org.wordpress.android.util.NetworkUtils; -import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.xmlrpc.android.XMLRPCCallback; import org.xmlrpc.android.XMLRPCClientInterface; @@ -51,12 +53,12 @@ public class SiteSettingsFragment extends PreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setRetainInstance(true); + if (!NetworkUtils.checkConnection(getActivity())) { getActivity().finish(); } - getActivity().setTitle(R.string.settings); - // make sure we have local site data mBlog = WordPress.getBlog( getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); @@ -64,11 +66,12 @@ public void onCreate(Bundle savedInstanceState) { // inflate Site Settings preferences from XML addPreferencesFromResource(R.xml.site_settings); - } - @Override - public void onResume() { - super.onResume(); + mRemoteTitle = ""; + mRemoteTagline = ""; + mRemoteAddress = ""; + mRemotePrivacy = 1; + mRemoteLanguage = ""; // set preference references, add change listeners, and setup various entries and values initPreferences(); @@ -78,13 +81,24 @@ public void onResume() { } @Override - public void onPause() { - super.onPause(); + public void onDestroy() { + super.onDestroy(); // Assume user wanted changes propagated when they leave applyChanges(); } + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putString("remote-title", mRemoteTitle); + outState.putString("remote-tagline", mRemoteTagline); + outState.putString("remote-address", mRemoteAddress); + outState.putInt("remote-privacy", mRemotePrivacy); + outState.putString("remote-language", mRemoteLanguage); + } + @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; @@ -175,22 +189,7 @@ public void onErrorResponse(VolleyError error) { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() }; - client.callAsync(new XMLRPCCallback() { - @Override - public void onSuccess(long id, final Object result) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - handleResponseToSelfHostedSettingsRequest((HashMap>) result); - } - }); - } - - @Override - public void onFailure(long id, Exception error) { - handleSettingsFetchError(error.toString()); - } - }, "wp.getOptions", params); + client.callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); } } @@ -202,15 +201,18 @@ private void handleSettingsFetchError(String error) { } } - private void handleResponseToSelfHostedSettingsRequest(Map> result) { - mRemoteTitle = StringUtils.notNullStr(result.get("blog_title").get("value")); + private void handleResponseToSelfHostedSettingsRequest(Map result) { + mRemoteTitle = getNestedMapValue(result, "blog_title"); changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); - mRemoteTagline = StringUtils.notNullStr(result.get("blog_tagline").get("value")); + mRemoteTagline = getNestedMapValue(result, "blog_tagline"); changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); - mRemoteAddress = StringUtils.notNullStr(result.get("blog_url").get("value")); + mRemoteAddress = getNestedMapValue(result, "blog_url"); changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + + mRemotePrivacy = 0; + mRemoteLanguage = convertLanguageIdToLanguageCode("1"); } /** @@ -321,32 +323,47 @@ private void initPreferences() { if (mTitlePreference != null) { mTitlePreference.setOnPreferenceChangeListener(this); + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); } if (mTaglinePreference != null) { mTaglinePreference.setOnPreferenceChangeListener(this); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); } if (mAddressPreference != null) { mAddressPreference.setOnPreferenceChangeListener(this); + changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); } if (mPrivacyPreference != null) { - mRemotePrivacy = -2; - mPrivacyPreference.setOnPreferenceChangeListener(this); + if (!mBlog.isDotcomFlag()) { + ((PreferenceCategory) findPreference(getString(R.string.pref_key_site_general))) + .removePreference(mPrivacyPreference); + } else { + mPrivacyPreference.setOnPreferenceChangeListener(this); + changePrivacyValue(mRemotePrivacy); + } } 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]); - } + if (!mBlog.isDotcomFlag()) { + ((PreferenceCategory) findPreference(getString(R.string.pref_key_site_general))) + .removePreference(mLanguagePreference); + } else { + // 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); - mLanguagePreference.setEntries( - createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); - mLanguagePreference.setOnPreferenceChangeListener(this); + changeLanguageValue(mRemoteLanguage); + } } } @@ -388,4 +405,39 @@ private String convertLanguageIdToLanguageCode(String id) { return ""; } + + private String getNestedMapValue(Map map, String key) { + if (map != null && key != null) { + return MapUtils.getMapStr((Map) map.get(key), "value"); + } + + return ""; + } + + /** + * Handles response to XML-RPC settings fetch + */ + private final XMLRPCCallback mXmlRpcFetchCallback = new XMLRPCCallback() { + @Override + public void onSuccess(long id, final Object result) { + if (isAdded() && result instanceof Map) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleResponseToSelfHostedSettingsRequest((Map) result); + } + }); + } + } + + @Override + public void onFailure(long id, final Exception error) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleSettingsFetchError(error.toString()); + } + }); + } + }; } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index bc877a63cbb9..1342fdd56857 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -404,6 +404,7 @@ wp_pref_notification_blogs wp_pref_notifications_enabled wp_pref_notification_types + wp_pref_site_general wp_pref_site_title wp_pref_site_tagline wp_pref_site_address diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 9af86660258c..5f0143a26a25 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -5,6 +5,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> Date: Sat, 1 Aug 2015 14:59:23 +0100 Subject: [PATCH 25/59] Making TypefaceCache members private. --- .../ui/prefs/SiteSettingsFragment.java | 26 +++++++++---------- .../android/widgets/TypefaceCache.java | 14 +++++----- WordPress/src/main/res/values/strings.xml | 7 +++++ 3 files changed, 27 insertions(+), 20 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 07389f6cbf35..a9062d37b472 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 @@ -123,19 +123,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return false; } - private String privacyStringForValue(int value) { - switch (value) { - case -1: - return getString(R.string.privacy_private); - case 0: - return getString(R.string.privacy_hidden); - case 1: - return getString(R.string.privacy_public); - default: - return ""; - } - } - /** * 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. @@ -367,6 +354,19 @@ private void initPreferences() { } } + private String privacyStringForValue(int value) { + switch (value) { + case -1: + return getString(R.string.privacy_private); + case 0: + return getString(R.string.privacy_hidden); + case 1: + return getString(R.string.privacy_public); + default: + return ""; + } + } + /** * Generates display strings for given language codes. Used as entries in language preference. */ diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java b/WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java index 5c2a33c055aa..ee4a75d7d36b 100644 --- a/WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java +++ b/WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java @@ -16,20 +16,20 @@ public class TypefaceCache { * Merriweather is also available via the "fontFamily" attribute */ - private static final int VARIATION_NORMAL = 0; - private static final int VARIATION_LIGHT = 1; - private static final int VARIATION_DEFAULT = VARIATION_NORMAL; + public static final int VARIATION_NORMAL = 0; + public static final int VARIATION_LIGHT = 1; + public static final int VARIATION_DEFAULT = VARIATION_NORMAL; - private static final int FAMILY_OPEN_SANS = 0; - private static final int FAMILY_MERRIWEATHER = 1; - private static final int FAMILY_DEFAULT = FAMILY_OPEN_SANS; + public static final int FAMILY_OPEN_SANS = 0; + public static final int FAMILY_MERRIWEATHER = 1; + public static final int FAMILY_DEFAULT = FAMILY_OPEN_SANS; private static final Hashtable mTypefaceCache = new Hashtable<>(); public static Typeface getTypeface(Context context) { return getTypeface(context, FAMILY_DEFAULT, Typeface.NORMAL, VARIATION_DEFAULT); } - private static Typeface getTypeface(Context context, + public static Typeface getTypeface(Context context, int family, int fontStyle, int variation) { diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 1342fdd56857..a23a77e78e45 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -646,6 +646,7 @@ + Privacy Public Hidden Private @@ -655,6 +656,12 @@ @string/privacy_private + + Your site is visible to everyone and may be indexed by search engines + Your site is visible to everyone but asks search engines not to index it + Your site is visible only to you and users you approve + + 1 From f22079346d6656eec607a4ba77f6722e9205c3be Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Sat, 1 Aug 2015 15:00:00 +0100 Subject: [PATCH 26/59] Adding custom preference views to show subtext and info button. --- .../ui/prefs/DetailListPreference.java | 139 ++++++++++++++++++ .../res/layout/detail_list_preference.xml | 51 +++++++ .../layout/detail_list_preference_title.xml | 30 ++++ WordPress/src/main/res/values/attrs.xml | 5 + WordPress/src/main/res/values/dimens.xml | 9 ++ WordPress/src/main/res/xml/site_settings.xml | 6 +- 6 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java create mode 100644 WordPress/src/main/res/layout/detail_list_preference.xml create mode 100644 WordPress/src/main/res/layout/detail_list_preference_title.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java new file mode 100644 index 000000000000..adf464f2475a --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -0,0 +1,139 @@ +package org.wordpress.android.ui.prefs; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.graphics.Typeface; +import android.preference.ListPreference; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.RadioButton; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.widgets.TypefaceCache; + +/** + * Custom {@link ListPreference} used to display detail text per item. + */ + +public class DetailListPreference extends ListPreference { + private DetailListAdapter mListAdapter; + private String[] mDetails; + private int mSelectedIndex; + + public DetailListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DetailListPreference); + + Log.d("", "index count =" + array.getIndexCount()); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.DetailListPreference_entryDetails) { + int id = array.getResourceId(index, -1); + if (id != -1) { + mDetails = array.getResources().getStringArray(id); + } else { + mDetails = null; + } + } + } + + array.recycle(); + } + + public DetailListPreference(Context context) { + super(context); + + mSelectedIndex = 0; + mDetails = null; + setLayoutResource(R.layout.detail_list_preference); + } + + @Override + protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) { + mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); + mSelectedIndex = findIndexOfValue(getValue()); + + builder.setSingleChoiceItems(mListAdapter, mSelectedIndex, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (mSelectedIndex != which) { + mSelectedIndex = which; + notifyChanged(); + } + DetailListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); + dialog.dismiss(); + } + }); + builder.setPositiveButton(null, null); + builder.setCustomTitle(View.inflate(getContext(), R.layout.detail_list_preference_title, null)); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + CharSequence[] entryValues = getEntryValues(); + if (positiveResult && entryValues != null && mSelectedIndex < entryValues.length) { + String value = entryValues[mSelectedIndex].toString(); + if (callChangeListener(value)) { + setValue(value); + } + } + } + + private class DetailListAdapter extends ArrayAdapter { + public DetailListAdapter(Context context, int resource, String[] objects) { + super(context, resource, objects); + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = View.inflate(getContext(), R.layout.detail_list_preference, null); + } + + final RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radio); + TextView mainText = (TextView) convertView.findViewById(R.id.main_text); + TextView detailText = (TextView) convertView.findViewById(R.id.detail_text); + + if (mainText != null && position < getEntries().length) { + mainText.setText(getEntries()[position]); + mainText.setTypeface(TypefaceCache.getTypeface(getContext(), + TypefaceCache.FAMILY_OPEN_SANS, + Typeface.NORMAL, + TypefaceCache.VARIATION_NORMAL)); + } + + if (detailText != null && position < mDetails.length) { + detailText.setText(mDetails[position]); + detailText.setTypeface(TypefaceCache.getTypeface(getContext(), + TypefaceCache.FAMILY_OPEN_SANS, + Typeface.NORMAL, + TypefaceCache.VARIATION_LIGHT)); + } + + if (radioButton != null && mSelectedIndex == position) { + radioButton.setChecked(true); + } + + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (radioButton != null) { + radioButton.setChecked(true); + } + DetailListPreference.this.callChangeListener(getEntryValues()[position]); + } + }); + + return convertView; + } + } +} diff --git a/WordPress/src/main/res/layout/detail_list_preference.xml b/WordPress/src/main/res/layout/detail_list_preference.xml new file mode 100644 index 000000000000..6718f5b7e8db --- /dev/null +++ b/WordPress/src/main/res/layout/detail_list_preference.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml new file mode 100644 index 000000000000..1664134f1647 --- /dev/null +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index 699426dc697f..a203d35b61ff 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -7,6 +7,11 @@ + + + + + diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index 844e7e5f7963..3786e6fbedc7 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -124,6 +124,15 @@ 3dp + + 16dp + 4dp + 8dp + 8dp + 4dp + 4dp + 4dp + 2dp 128dp diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 5f0143a26a25..95aebc1b73c9 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -31,12 +31,14 @@ app:summaryLines="1" app:maxSummaryLines="1" /> - + android:entryValues="@array/privacy_values" + android:defaultValue="-2" + app:entryDetails="@array/privacy_details" /> Date: Sat, 1 Aug 2015 15:58:50 +0100 Subject: [PATCH 27/59] Clicking info button opens help document. --- .../ui/prefs/DetailListPreference.java | 19 ++++++++++++++++++- .../layout/detail_list_preference_title.xml | 12 +++++++----- WordPress/src/main/res/values/strings.xml | 3 +++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index adf464f2475a..31cb7e6193cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -3,8 +3,10 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Typeface; +import android.net.Uri; import android.preference.ListPreference; import android.support.annotation.NonNull; import android.util.AttributeSet; @@ -17,6 +19,7 @@ import org.wordpress.android.R; import org.wordpress.android.widgets.TypefaceCache; +import org.wordpress.passcodelock.AppLockManager; /** * Custom {@link ListPreference} used to display detail text per item. @@ -74,7 +77,21 @@ public void onClick(DialogInterface dialog, int which) { } }); builder.setPositiveButton(null, null); - builder.setCustomTitle(View.inflate(getContext(), R.layout.detail_list_preference_title, null)); + + View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); + + if (titleView != null) { + titleView.findViewById(R.id.privacy_info_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Uri uri = Uri.parse(getContext().getString(R.string.privacy_settings_url)); + AppLockManager.getInstance().setExtendedTimeout(); + getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri)); + } + }); + + builder.setCustomTitle(titleView); + } } @Override diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index 1664134f1647..555dcac614fa 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -3,13 +3,13 @@ + android:layout_height="wrap_content"> + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" /> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index a23a77e78e45..d40bd9073758 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -1069,4 +1069,7 @@ Discourage search engines from indexing this site Allow search engines to index this site + + https://en.support.wordpress.com/settings/privacy-settings + From 763ce4365b884b5515eede6c95ed68560f54dc03 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Sun, 2 Aug 2015 14:33:09 +0100 Subject: [PATCH 28/59] Cleaning up layout. Adding ripple effect to info button --- .../android/ui/prefs/DetailListPreference.java | 13 ++++++++++--- .../layout/detail_list_preference_title.xml | 18 ++++++++++++------ WordPress/src/main/res/values/dimens.xml | 4 ++-- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index 31cb7e6193cd..7aaeef165c73 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -76,12 +76,19 @@ public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); - builder.setPositiveButton(null, null); + builder.setNegativeButton(R.string.cancel, null); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // TODO: save new setting + } + }); View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); - if (titleView != null) { - titleView.findViewById(R.id.privacy_info_button).setOnClickListener(new View.OnClickListener() { + final View infoView = titleView.findViewById(R.id.privacy_info_button); + + infoView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse(getContext().getString(R.string.privacy_settings_url)); diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index 555dcac614fa..37732800ff47 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -6,27 +6,33 @@ android:paddingBottom="12dp" android:paddingLeft="24dp" android:paddingStart="24dp" - android:paddingRight="24dp" + android:paddingRight="16dp" android:paddingEnd="24dp" + android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> + android:scaleType="centerInside" /> diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index 3786e6fbedc7..a86c9e7ed76c 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -127,8 +127,8 @@ 16dp 4dp - 8dp - 8dp + 0dp + 12dp 4dp 4dp 4dp From 8c99caf0ebd009fea0d52228b5a6644700b3c05b Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 12:17:36 +0100 Subject: [PATCH 29/59] Hints displayed on Preference long click. --- .../ui/prefs/BlogPreferencesActivity.java | 1 - .../ui/prefs/DetailListPreference.java | 25 +- .../ui/prefs/SiteSettingsFragment.java | 269 +++++++++++------- .../ui/prefs/SummaryEditTextPreference.java | 17 +- WordPress/src/main/res/values/attrs.xml | 4 + WordPress/src/main/res/values/strings.xml | 13 +- WordPress/src/main/res/xml/site_settings.xml | 29 +- 7 files changed, 243 insertions(+), 115 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 f2bca4849b13..196b10677980 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 @@ -12,7 +12,6 @@ import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; import org.wordpress.android.ui.ActivityLauncher; -import org.wordpress.android.util.StringUtils; /** * Activity for configuring blog specific settings. diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index 7aaeef165c73..078e2cf7a254 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -9,8 +9,8 @@ import android.net.Uri; import android.preference.ListPreference; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -25,18 +25,17 @@ * Custom {@link ListPreference} used to display detail text per item. */ -public class DetailListPreference extends ListPreference { +public class DetailListPreference extends ListPreference implements SiteSettingsFragment.HasHint { private DetailListAdapter mListAdapter; private String[] mDetails; private int mSelectedIndex; + private String mHint; public DetailListPreference(Context context, AttributeSet attrs) { super(context, attrs); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DetailListPreference); - Log.d("", "index count =" + array.getIndexCount()); - for (int i = 0; i < array.getIndexCount(); ++i) { int index = array.getIndex(i); if (index == R.styleable.DetailListPreference_entryDetails) { @@ -46,6 +45,8 @@ public DetailListPreference(Context context, AttributeSet attrs) { } else { mDetails = null; } + } else if (index == R.styleable.DetailListPreference_longClickHint) { + mHint = array.getString(index); } } @@ -60,6 +61,10 @@ public DetailListPreference(Context context) { setLayoutResource(R.layout.detail_list_preference); } + public void setDetails(String[] details) { + mDetails = details; + } + @Override protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) { mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); @@ -86,7 +91,7 @@ public void onClick(DialogInterface dialog, int which) { View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); if (titleView != null) { - final View infoView = titleView.findViewById(R.id.privacy_info_button); + View infoView = titleView.findViewById(R.id.privacy_info_button); infoView.setOnClickListener(new View.OnClickListener() { @Override @@ -160,4 +165,14 @@ public void onClick(View v) { return convertView; } } + + @Override + public boolean hasHint() { + return !TextUtils.isEmpty(mHint); + } + + @Override + public String getHintText() { + return mHint; + } } 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 a9062d37b472..e00246bae29e 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,11 +2,16 @@ import android.os.Bundle; import android.preference.EditTextPreference; -import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.ListView; import com.android.volley.VolleyError; import com.wordpress.rest.RestRequest; @@ -21,6 +26,7 @@ import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; import org.xmlrpc.android.XMLRPCCallback; +import org.xmlrpc.android.XMLRPCClient; import org.xmlrpc.android.XMLRPCClientInterface; import org.xmlrpc.android.XMLRPCFactory; @@ -33,14 +39,19 @@ */ public class SiteSettingsFragment extends PreferenceFragment - implements Preference.OnPreferenceChangeListener { + implements Preference.OnPreferenceChangeListener, AdapterView.OnItemLongClickListener { + public interface HasHint { + boolean hasHint(); + String getHintText(); + } + private HashMap mLanguageCodes = new HashMap<>(); private Blog mBlog; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; private EditTextPreference mAddressPreference; - private ListPreference mLanguagePreference; - private ListPreference mPrivacyPreference; + private DetailListPreference mLanguagePreference; + private DetailListPreference mPrivacyPreference; // Most recent remote site data. Current local data is used if remote data cannot be fetched. private String mRemoteTitle; @@ -67,12 +78,6 @@ public void onCreate(Bundle savedInstanceState) { // inflate Site Settings preferences from XML addPreferencesFromResource(R.xml.site_settings); - mRemoteTitle = ""; - mRemoteTagline = ""; - mRemoteAddress = ""; - mRemotePrivacy = 1; - mRemoteLanguage = ""; - // set preference references, add change listeners, and setup various entries and values initPreferences(); @@ -99,6 +104,23 @@ public void onSaveInstanceState(@NonNull Bundle outState) { outState.putString("remote-language", mRemoteLanguage); } + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + + // Setup the preferences to handled long clicks + if (view != null) { + ListView prefList = (ListView) view.findViewById(android.R.id.list); + + if (prefList != null) { + prefList.setOnItemLongClickListener(this); + } + } + + return view; + } + @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; @@ -123,28 +145,77 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return false; } + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ListView listView = (ListView) parent; + ListAdapter listAdapter = listView.getAdapter(); + Object obj = listAdapter.getItem(position); + + if (obj != null) { + if (obj instanceof View.OnLongClickListener) { + View.OnLongClickListener longListener = (View.OnLongClickListener) obj; + return longListener.onLongClick(view); + } else if (obj instanceof HasHint && ((HasHint) obj).hasHint()) { + ToastUtils.showToast(getActivity(), ((HasHint)obj).getHintText(), ToastUtils.Duration.SHORT); + return true; + } + } + + return false; + } + /** - * 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. + * Helper method to retrieve {@link Preference} references and initialize any data. */ - private void changeEditTextPreferenceValue(EditTextPreference pref, String newValue) { - if (pref != null && newValue != null && !newValue.equals(pref.getSummary())) { - pref.setText(newValue); - pref.setSummary(newValue); + private void initPreferences() { + // Title preference + if (null != (mTitlePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)))) { + mTitlePreference.setOnPreferenceChangeListener(this); } - } - private void changeLanguageValue(String newValue) { - if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { - mLanguagePreference.setValue(newValue); - mLanguagePreference.setSummary(getLanguageString(newValue, Locale.getDefault())); + // Tagline preference + if (null != (mTaglinePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)))) { + mTaglinePreference.setOnPreferenceChangeListener(this); } - } - private void changePrivacyValue(int newValue) { - if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) == newValue) { - mPrivacyPreference.setValue(String.valueOf(newValue)); - mPrivacyPreference.setSummary(privacyStringForValue(newValue)); + // Address preferences + if (null != (mAddressPreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_address)))) { + mAddressPreference.setOnPreferenceChangeListener(this); + } + + // Privacy preference, removed for self-hosted sites + if (null != (mPrivacyPreference = + (DetailListPreference) findPreference(getString(R.string.pref_key_site_visibility)))) { + if (!mBlog.isDotcomFlag()) { + removePreference(R.string.pref_key_site_general, mPrivacyPreference); + } else { + mPrivacyPreference.setOnPreferenceChangeListener(this); + } + } + + // Language preference, removed for self-hosted sites + if (null != (mLanguagePreference = + (DetailListPreference) findPreference(getString(R.string.pref_key_site_language)))) { + if (!mBlog.isDotcomFlag()) { + removePreference(R.string.pref_key_site_general, mLanguagePreference); + } else { + // Generate map of language codes + String[] languageIds = getResources().getStringArray(R.array.lang_ids); + String[] languageCodes = getResources().getStringArray(R.array.language_codes); + String[] details = new String[languageIds.length]; + for (int i = 0; i < languageIds.length && i < languageCodes.length; ++i) { + mLanguageCodes.put(languageCodes[i], languageIds[i]); + details[i] = getLanguageString(languageCodes[i], Locale.getDefault()); + } + + mLanguagePreference.setEntries( + createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); + mLanguagePreference.setOnPreferenceChangeListener(this); + mLanguagePreference.setDetails(details); + } } } @@ -176,7 +247,7 @@ public void onErrorResponse(VolleyError error) { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() }; - client.callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); + client.callAsync(mXmlRpcFetchCallback, XMLRPCClient.METHOD_GET_OPTIONS, params); } } @@ -189,28 +260,39 @@ private void handleSettingsFetchError(String error) { } private void handleResponseToSelfHostedSettingsRequest(Map result) { - mRemoteTitle = getNestedMapValue(result, "blog_title"); - changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); - - mRemoteTagline = getNestedMapValue(result, "blog_tagline"); - changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + if (mTitlePreference != null) { + mTitlePreference.setEnabled(true); + mRemoteTitle = getNestedMapValue(result, "blog_title"); + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + } - mRemoteAddress = getNestedMapValue(result, "blog_url"); - changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + if (mTaglinePreference != null) { + mTaglinePreference.setEnabled(true); + mRemoteTagline = getNestedMapValue(result, "blog_tagline"); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + } - mRemotePrivacy = 0; - mRemoteLanguage = convertLanguageIdToLanguageCode("1"); + if (mAddressPreference != null) { + mRemoteAddress = getNestedMapValue(result, "blog_url"); + changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + } } /** * Helper method to parse JSON response to REST request. */ private void handleResponseToWPComSettingsRequest(JSONObject response) { - mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); - changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + if (mTitlePreference != null) { + mTitlePreference.setEnabled(true); + mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + } - mRemoteTagline = response.optString(RestClientUtils.SITE_DESC_KEY); - changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + if (mTaglinePreference != null) { + mTaglinePreference.setEnabled(true); + mRemoteTagline = response.optString(RestClientUtils.SITE_DESC_KEY); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + } mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); @@ -220,12 +302,14 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { if (settingsObject != null) { mRemoteLanguage = convertLanguageIdToLanguageCode(settingsObject.optString("lang_id")); if (mLanguagePreference != null) { + mLanguagePreference.setEnabled(true); changeLanguageValue(mRemoteLanguage); mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); } mRemotePrivacy = settingsObject.optInt("blog_public"); if (mPrivacyPreference != null) { + mPrivacyPreference.setEnabled(true); mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); } changePrivacyValue(mRemotePrivacy); @@ -234,12 +318,13 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { /** * Helper method to create the parameters for the site settings POST request + * + * Using undocumented endpoint WPCOM_JSON_API_Site_Settings_Endpoint + * https://wpcom.trac.automattic.com/browser/trunk/public.api/rest/json-endpoints.php#L1903 */ private HashMap generatePostParams() { HashMap params = new HashMap<>(); - // 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 && !mTitlePreference.getText().equals(mRemoteTitle)) { params.put("blogname", mTitlePreference.getText()); } @@ -249,7 +334,6 @@ private HashMap generatePostParams() { } if (mAddressPreference != null && !mAddressPreference.getText().equals(mRemoteAddress)) { - // TODO } if (mLanguagePreference != null && @@ -258,7 +342,8 @@ private HashMap generatePostParams() { params.put("lang_id", String.valueOf(mLanguageCodes.get(mLanguagePreference.getValue()))); } - if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) != mRemotePrivacy) { + if (mPrivacyPreference != null && + Integer.valueOf(mPrivacyPreference.getValue()) != mRemotePrivacy) { params.put("blog_public", mPrivacyPreference.getValue()); } @@ -294,66 +379,33 @@ public void onErrorResponse(VolleyError error) { } /** - * Helper method to setup preferences and set initial values + * 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 initPreferences() { - mTitlePreference = - (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); - mTaglinePreference = - (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); - 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); - changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); - } - - if (mTaglinePreference != null) { - mTaglinePreference.setOnPreferenceChangeListener(this); - changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); - } - - if (mAddressPreference != null) { - mAddressPreference.setOnPreferenceChangeListener(this); - changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + private void changeEditTextPreferenceValue(EditTextPreference pref, String newValue) { + if (pref != null && newValue != null && !newValue.equals(pref.getSummary())) { + pref.setText(newValue); + pref.setSummary(newValue); } + } - if (mPrivacyPreference != null) { - if (!mBlog.isDotcomFlag()) { - ((PreferenceCategory) findPreference(getString(R.string.pref_key_site_general))) - .removePreference(mPrivacyPreference); - } else { - mPrivacyPreference.setOnPreferenceChangeListener(this); - changePrivacyValue(mRemotePrivacy); - } + private void changeLanguageValue(String newValue) { + if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { + mLanguagePreference.setValue(newValue); + mLanguagePreference.setSummary(getLanguageString(newValue, Locale.getDefault())); } + } - if (mLanguagePreference != null) { - if (!mBlog.isDotcomFlag()) { - ((PreferenceCategory) findPreference(getString(R.string.pref_key_site_general))) - .removePreference(mLanguagePreference); - } else { - // 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); - - changeLanguageValue(mRemoteLanguage); - } + private void changePrivacyValue(int newValue) { + if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) == newValue) { + mPrivacyPreference.setValue(String.valueOf(newValue)); + mPrivacyPreference.setSummary(privacyStringForValue(newValue)); } } + /** + * Returns non-null String representation of WordPress.com privacy value. + */ private String privacyStringForValue(int value) { switch (value) { case -1: @@ -376,7 +428,8 @@ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes CharSequence[] displayStrings = new CharSequence[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - displayStrings[i] = getLanguageString(String.valueOf(languageCodes[i]), Locale.getDefault()); + displayStrings[i] = getLanguageString( + String.valueOf(languageCodes[i]), new Locale(languageCodes[i].toString())); } return displayStrings; @@ -394,6 +447,9 @@ private String getLanguageString(String languageCode, Locale displayLocale) { return languageLocale.getDisplayLanguage(displayLocale) + languageCode.substring(2); } + /** + * Converts a language ID (WordPress defined) to a language code (i.e. en, es, gb, etc...). + */ private String convertLanguageIdToLanguageCode(String id) { if (id != null) { for (String key : mLanguageCodes.keySet()) { @@ -406,6 +462,9 @@ private String convertLanguageIdToLanguageCode(String id) { return ""; } + /** + * Helper method to get a value from a nested Map. Used to parse self-hosted response object. + */ private String getNestedMapValue(Map map, String key) { if (map != null && key != null) { return MapUtils.getMapStr((Map) map.get(key), "value"); @@ -414,6 +473,19 @@ private String getNestedMapValue(Map map, String key) { return ""; } + /** + * Removes a {@link Preference} from the {@link PreferenceCategory} with the given key. + */ + private void removePreference(int categoryKey, Preference preference) { + if (preference == null) return; + + PreferenceCategory category = (PreferenceCategory) findPreference(getString(categoryKey)); + + if (category != null) { + category.removePreference(preference); + } + } + /** * Handles response to XML-RPC settings fetch */ @@ -427,6 +499,9 @@ public void run() { handleResponseToSelfHostedSettingsRequest((Map) result); } }); + } else { + // Response is considered an error if we are unable to parse it + handleSettingsFetchError("Invalid response object (exprected Map): " + result); } } 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 19d8b5ba36d9..5f40a94c836c 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 @@ -21,11 +21,14 @@ * (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) + * - app:longClickHint : sets the string to be shown in a Toast when preference is long clicked */ -public class SummaryEditTextPreference extends EditTextPreference { +public class SummaryEditTextPreference extends EditTextPreference + implements SiteSettingsFragment.HasHint { private int mLines; private int mMaxLines; + private String mHint; public SummaryEditTextPreference(Context context) { super(context); @@ -49,6 +52,8 @@ public SummaryEditTextPreference(Context context, AttributeSet attrs) { mLines = array.getInt(index, -1); } else if (index == R.styleable.SummaryEditTextPreference_maxSummaryLines) { mMaxLines = array.getInt(index, -1); + } else if (index == R.styleable.SummaryEditTextPreference_longClickHint) { + mHint = array.getString(index); } } @@ -66,4 +71,14 @@ public void onBindView(@NonNull View view) { if (mMaxLines != -1) summary.setMaxLines(mMaxLines); } } + + @Override + public boolean hasHint() { + return !TextUtils.isEmpty(mHint); + } + + @Override + public String getHintText() { + return mHint; + } } diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index a203d35b61ff..175cfafedea9 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -1,15 +1,19 @@ + + + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index d40bd9073758..45a69c523f18 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -419,18 +419,25 @@ wp_pref_site_delete_site - Settings - %s General Site Title Tagline Address Privacy @string/language - What\'s this site about - Words to live by + In a few words, explain what this site is about. + A short description or catchy phrase to describe your blog. + Changing your address is not currently supported. + Controls who can see your site. + Language this blog is primarily written in. Related Posts Related Posts Show related content after posts + Fetching title + Fetching tagline + Fetching address + Fetching privacy + Fetching language Open source licenses diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 95aebc1b73c9..7052864518c1 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -9,43 +9,56 @@ android:title="@string/site_settings_general_header"> + android:summary="@string/site_settings_title_default_summary" + app:summaryLines="1" + app:maxSummaryLines="2" + app:longClickHint="@string/site_title_hint" /> + app:maxSummaryLines="1" + app:longClickHint="@string/site_tagline_hint" /> + app:maxSummaryLines="1" + app:longClickHint="@string/site_address_hint" /> - + android:entryValues="@array/language_codes" + app:longClickHint="@string/site_language_hint" /> From c4eefbfe968041752eff049f5138871baf76ed2d Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 12:22:35 +0100 Subject: [PATCH 30/59] Fixing build --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e00246bae29e..860b38fd1445 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 @@ -247,7 +247,7 @@ public void onErrorResponse(VolleyError error) { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() }; - client.callAsync(mXmlRpcFetchCallback, XMLRPCClient.METHOD_GET_OPTIONS, params); + client.callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); } } From 0f05b429117bd2c611c3e0e4633ff84a6df11ee7 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 12:28:32 +0100 Subject: [PATCH 31/59] Capitalize first letter of language strings. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 860b38fd1445..b495f43c4dd3 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 @@ -422,14 +422,16 @@ private String privacyStringForValue(int value) { /** * Generates display strings for given language codes. Used as entries in language preference. */ - private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes) { + private String[] createLanguageDisplayStrings(CharSequence[] languageCodes) { if (languageCodes == null || languageCodes.length < 1) return null; - CharSequence[] displayStrings = new CharSequence[languageCodes.length]; + String[] displayStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { displayStrings[i] = getLanguageString( String.valueOf(languageCodes[i]), new Locale(languageCodes[i].toString())); + + displayStrings[i] = displayStrings[i].substring(0, 1).toUpperCase() + displayStrings[i].substring(1); } return displayStrings; From c18413759be2e8813177a5773519cf4747469775 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 13:19:07 +0100 Subject: [PATCH 32/59] Fixing RTL language display. --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 1 - WordPress/src/main/res/layout/detail_list_preference.xml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) 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 b495f43c4dd3..17d9f34f5bce 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 @@ -26,7 +26,6 @@ import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; import org.xmlrpc.android.XMLRPCCallback; -import org.xmlrpc.android.XMLRPCClient; import org.xmlrpc.android.XMLRPCClientInterface; import org.xmlrpc.android.XMLRPCFactory; diff --git a/WordPress/src/main/res/layout/detail_list_preference.xml b/WordPress/src/main/res/layout/detail_list_preference.xml index 6718f5b7e8db..65eec3160f9a 100644 --- a/WordPress/src/main/res/layout/detail_list_preference.xml +++ b/WordPress/src/main/res/layout/detail_list_preference.xml @@ -34,6 +34,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_sz_large" android:textColor="@color/grey_dark" + android:gravity="left" style="@style/Calypso.Text.Header" tools:text="Main Text" /> From 6ed9e7da104d9d2521a853a38a20f0f0b1165db6 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 15:14:37 +0100 Subject: [PATCH 33/59] Language/privacy updated to use more generic DetailListPreference. --- .../ui/prefs/DetailListPreference.java | 43 ++++++++++++++----- .../layout/detail_list_preference_title.xml | 4 +- WordPress/src/main/res/values/attrs.xml | 2 + WordPress/src/main/res/values/strings.xml | 3 +- WordPress/src/main/res/xml/site_settings.xml | 4 ++ 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index 078e2cf7a254..ff4d9011d4cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -25,11 +25,14 @@ * Custom {@link ListPreference} used to display detail text per item. */ -public class DetailListPreference extends ListPreference implements SiteSettingsFragment.HasHint { +public class DetailListPreference extends ListPreference + implements SiteSettingsFragment.HasHint { private DetailListAdapter mListAdapter; private String[] mDetails; private int mSelectedIndex; + private String mTitle; private String mHint; + private String mHelpUrl; public DetailListPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -47,6 +50,10 @@ public DetailListPreference(Context context, AttributeSet attrs) { } } else if (index == R.styleable.DetailListPreference_longClickHint) { mHint = array.getString(index); + } else if (index == R.styleable.DetailListPreference_dialogTitle) { + mTitle = array.getString(index); + } else if (index == R.styleable.DetailListPreference_dialogHelpUrl) { + mHelpUrl = array.getString(index); } } @@ -90,19 +97,35 @@ public void onClick(DialogInterface dialog, int which) { }); View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); - if (titleView != null) { - View infoView = titleView.findViewById(R.id.privacy_info_button); - infoView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Uri uri = Uri.parse(getContext().getString(R.string.privacy_settings_url)); - AppLockManager.getInstance().setExtendedTimeout(); - getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri)); + // Don't show the custom title view if there is no title or help URL + if (titleView != null && !TextUtils.isEmpty(mTitle) && !TextUtils.isEmpty(mHelpUrl)) { + TextView titleText = (TextView) titleView.findViewById(R.id.title); + View infoView = titleView.findViewById(R.id.info_button); + + if (infoView != null) { + if (TextUtils.isEmpty(mHelpUrl)) { + infoView.setVisibility(View.GONE); + } else { + infoView.setVisibility(View.VISIBLE); + infoView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Uri uri = Uri.parse(mHelpUrl); + AppLockManager.getInstance().setExtendedTimeout(); + getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri)); + } + }); } - }); + } + + if (titleText != null) { + titleText.setText(mTitle); + } builder.setCustomTitle(titleView); + } else { + builder.setTitle(getTitle()); } } diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index 37732800ff47..fd8ff61f5b30 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -14,7 +14,6 @@ + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 45a69c523f18..dba2f932059b 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -1077,6 +1077,7 @@ Allow search engines to index this site - https://en.support.wordpress.com/settings/privacy-settings + https://en.support.wordpress.com/privacy-settings + https://en.support.wordpress.com/language-settings diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 7052864518c1..80d9acd0dce9 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -47,6 +47,8 @@ android:entryValues="@array/privacy_values" android:defaultValue="-2" android:summary="@string/site_settings_privacy_default_summary" + app:dialogTitle="@string/site_settings_visibility_header" + app:dialogHelpUrl="@string/privacy_settings_url" app:longClickHint="@string/site_privacy_hint" app:entryDetails="@array/privacy_details" /> @@ -58,6 +60,8 @@ android:summary="@string/site_settings_language_default_summary" android:entries="@array/available_languages" android:entryValues="@array/language_codes" + app:dialogTitle="@string/site_settings_language_header" + app:dialogHelpUrl="@string/language_settings_url" app:longClickHint="@string/site_language_hint" /> From 03e1f725c4cbbb59b1da3e02d8cf0f6087738f7b Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 4 Aug 2015 16:37:20 +0100 Subject: [PATCH 34/59] Improving language string generation. Details shown in selected locale. --- .../ui/prefs/DetailListPreference.java | 12 +++---- .../ui/prefs/SiteSettingsFragment.java | 33 +++++++++++++++---- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index ff4d9011d4cd..50a67d802883 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -89,12 +89,7 @@ public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton(R.string.cancel, null); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // TODO: save new setting - } - }); + builder.setPositiveButton(R.string.ok, null); View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); @@ -171,14 +166,15 @@ public View getView(final int position, View convertView, ViewGroup parent) { TypefaceCache.VARIATION_LIGHT)); } - if (radioButton != null && mSelectedIndex == position) { - radioButton.setChecked(true); + if (radioButton != null) { + radioButton.setChecked(mSelectedIndex == position); } convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (radioButton != null) { + mSelectedIndex = position; radioButton.setChecked(true); } DetailListPreference.this.callChangeListener(getEntryValues()[position]); 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 17d9f34f5bce..ee5477a0487d 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 @@ -201,19 +201,14 @@ private void initPreferences() { if (!mBlog.isDotcomFlag()) { removePreference(R.string.pref_key_site_general, mLanguagePreference); } else { + mLanguagePreference.setOnPreferenceChangeListener(this); + // Generate map of language codes String[] languageIds = getResources().getStringArray(R.array.lang_ids); String[] languageCodes = getResources().getStringArray(R.array.language_codes); - String[] details = new String[languageIds.length]; for (int i = 0; i < languageIds.length && i < languageCodes.length; ++i) { mLanguageCodes.put(languageCodes[i], languageIds[i]); - details[i] = getLanguageString(languageCodes[i], Locale.getDefault()); } - - mLanguagePreference.setEntries( - createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); - mLanguagePreference.setOnPreferenceChangeListener(this); - mLanguagePreference.setDetails(details); } } } @@ -301,6 +296,10 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { if (settingsObject != null) { mRemoteLanguage = convertLanguageIdToLanguageCode(settingsObject.optString("lang_id")); if (mLanguagePreference != null) { + String[] languageCodes = getResources().getStringArray(R.array.language_codes); + mLanguagePreference.setEntries(createLanguageDisplayStrings(languageCodes)); + mLanguagePreference.setDetails( + createLanguageDetailDisplayStrings(languageCodes, mRemoteLanguage)); mLanguagePreference.setEnabled(true); changeLanguageValue(mRemoteLanguage); mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); @@ -391,7 +390,10 @@ private void changeEditTextPreferenceValue(EditTextPreference pref, String newVa private void changeLanguageValue(String newValue) { if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { mLanguagePreference.setValue(newValue); + // TODO: set summary in selected locale mLanguagePreference.setSummary(getLanguageString(newValue, Locale.getDefault())); + + // TODO: change detail strings } } @@ -436,6 +438,23 @@ private String[] createLanguageDisplayStrings(CharSequence[] languageCodes) { return displayStrings; } + /** + * Generates detail display strings in the currently selected locale. Used as detail text + * in language preference dialog. + */ + public String[] createLanguageDetailDisplayStrings(String[] languageCodes, String locale) { + if (languageCodes == null || languageCodes.length < 1) return null; + + String[] detailStrings = new String[languageCodes.length]; + for (int i = 0; i < languageCodes.length; ++i) { + detailStrings[i] = getLanguageString(languageCodes[i], new Locale(locale)); + + detailStrings[i] = detailStrings[i].substring(0, 1).toUpperCase() + detailStrings[i].substring(1); + } + + return detailStrings; + } + /** * Return a non-null display string for a given language code. */ From d76785f64add04278941d1242fc70f51611eb426 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 10:49:44 +0100 Subject: [PATCH 35/59] Updating detail strings for language dialog when new language is chosen. --- .../ui/prefs/DetailListPreference.java | 79 ++++++++++++------- .../ui/prefs/SiteSettingsFragment.java | 51 +++++++----- 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index 50a67d802883..2fdbc1a391d3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -29,6 +29,7 @@ public class DetailListPreference extends ListPreference implements SiteSettingsFragment.HasHint { private DetailListAdapter mListAdapter; private String[] mDetails; + private int mStartingIndex; private int mSelectedIndex; private String mTitle; private String mHint; @@ -68,28 +69,29 @@ public DetailListPreference(Context context) { setLayoutResource(R.layout.detail_list_preference); } - public void setDetails(String[] details) { - mDetails = details; - } - @Override protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) { mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); - mSelectedIndex = findIndexOfValue(getValue()); + mStartingIndex = mSelectedIndex = findIndexOfValue(getValue()); builder.setSingleChoiceItems(mListAdapter, mSelectedIndex, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (mSelectedIndex != which) { mSelectedIndex = which; + mListAdapter.notifyDataSetChanged(); + setValue(getEntryValues()[mSelectedIndex].toString()); notifyChanged(); } - DetailListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); - dialog.dismiss(); } }); builder.setNegativeButton(R.string.cancel, null); - builder.setPositiveButton(R.string.ok, null); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DetailListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); + } + }); View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); @@ -126,15 +128,35 @@ public void onClick(View v) { @Override protected void onDialogClosed(boolean positiveResult) { - CharSequence[] entryValues = getEntryValues(); - if (positiveResult && entryValues != null && mSelectedIndex < entryValues.length) { - String value = entryValues[mSelectedIndex].toString(); - if (callChangeListener(value)) { - setValue(value); - } + CharSequence[] values = getEntryValues(); + if (values != null && mSelectedIndex < values.length && mSelectedIndex != mStartingIndex) { + String value = values[positiveResult ? mSelectedIndex : mStartingIndex].toString(); + setValue(value); + callChangeListener(value); + } + } + + @Override + public boolean hasHint() { + return !TextUtils.isEmpty(mHint); + } + + @Override + public String getHintText() { + return mHint; + } + + public void refreshAdapter() { + if (mListAdapter != null) { + mListAdapter.notifyDataSetChanged(); } } + public void setDetails(String[] details) { + mDetails = details; + refreshAdapter(); + } + private class DetailListAdapter extends ArrayAdapter { public DetailListAdapter(Context context, int resource, String[] objects) { super(context, resource, objects); @@ -168,30 +190,33 @@ public View getView(final int position, View convertView, ViewGroup parent) { if (radioButton != null) { radioButton.setChecked(mSelectedIndex == position); + radioButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + changeSelection(radioButton, position); + } + }); } convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (radioButton != null) { - mSelectedIndex = position; - radioButton.setChecked(true); - } - DetailListPreference.this.callChangeListener(getEntryValues()[position]); + changeSelection(radioButton, position); } }); return convertView; } - } - @Override - public boolean hasHint() { - return !TextUtils.isEmpty(mHint); - } + private void changeSelection(RadioButton radioButton, int position) { + CharSequence[] values = getEntryValues(); - @Override - public String getHintText() { - return mHint; + if (radioButton != null && mSelectedIndex != position && + values != null && position < values.length) { + mSelectedIndex = position; + radioButton.setChecked(true); + callChangeListener(values[position]); + } + } } } 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 ee5477a0487d..f746944e25d4 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 @@ -6,6 +6,7 @@ import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -302,7 +303,9 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { createLanguageDetailDisplayStrings(languageCodes, mRemoteLanguage)); mLanguagePreference.setEnabled(true); changeLanguageValue(mRemoteLanguage); - mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); + mLanguagePreference.setSummary( + firstLetterCapitalized( + getLanguageString(mRemoteLanguage, new Locale(mRemoteLanguage)))); } mRemotePrivacy = settingsObject.optInt("blog_public"); @@ -334,7 +337,7 @@ private HashMap generatePostParams() { if (mAddressPreference != null && !mAddressPreference.getText().equals(mRemoteAddress)) { } - if (mLanguagePreference != null && + if (mLanguagePreference != null && mLanguageCodes != null && mRemoteLanguage != null && mLanguageCodes.containsKey(mLanguagePreference.getValue()) && !mRemoteLanguage.equals(mLanguageCodes.get(mLanguagePreference.getValue()))) { params.put("lang_id", String.valueOf(mLanguageCodes.get(mLanguagePreference.getValue()))); @@ -391,9 +394,12 @@ private void changeLanguageValue(String newValue) { if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { mLanguagePreference.setValue(newValue); // TODO: set summary in selected locale - mLanguagePreference.setSummary(getLanguageString(newValue, Locale.getDefault())); + mLanguagePreference.setSummary(getLanguageString(newValue, new Locale(newValue))); - // TODO: change detail strings + String[] languageCodes = getResources().getStringArray(R.array.language_codes); + mLanguagePreference.setEntries(createLanguageDisplayStrings(languageCodes)); + mLanguagePreference.setDetails(createLanguageDetailDisplayStrings(languageCodes, newValue)); + mLanguagePreference.refreshAdapter(); } } @@ -429,10 +435,8 @@ private String[] createLanguageDisplayStrings(CharSequence[] languageCodes) { String[] displayStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - displayStrings[i] = getLanguageString( - String.valueOf(languageCodes[i]), new Locale(languageCodes[i].toString())); - - displayStrings[i] = displayStrings[i].substring(0, 1).toUpperCase() + displayStrings[i].substring(1); + displayStrings[i] = firstLetterCapitalized(getLanguageString( + String.valueOf(languageCodes[i]), new Locale(languageCodes[i].toString()))); } return displayStrings; @@ -447,9 +451,8 @@ public String[] createLanguageDetailDisplayStrings(String[] languageCodes, Strin String[] detailStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - detailStrings[i] = getLanguageString(languageCodes[i], new Locale(locale)); - - detailStrings[i] = detailStrings[i].substring(0, 1).toUpperCase() + detailStrings[i].substring(1); + detailStrings[i] = firstLetterCapitalized( + getLanguageString(languageCodes[i], new Locale(locale))); } return detailStrings; @@ -467,6 +470,19 @@ private String getLanguageString(String languageCode, Locale displayLocale) { return languageLocale.getDisplayLanguage(displayLocale) + languageCode.substring(2); } + /** + * Removes a {@link Preference} from the {@link PreferenceCategory} with the given key. + */ + private void removePreference(int categoryKey, Preference preference) { + if (preference == null) return; + + PreferenceCategory category = (PreferenceCategory) findPreference(getString(categoryKey)); + + if (category != null) { + category.removePreference(preference); + } + } + /** * Converts a language ID (WordPress defined) to a language code (i.e. en, es, gb, etc...). */ @@ -493,17 +509,10 @@ private String getNestedMapValue(Map map, String key) { return ""; } - /** - * Removes a {@link Preference} from the {@link PreferenceCategory} with the given key. - */ - private void removePreference(int categoryKey, Preference preference) { - if (preference == null) return; - - PreferenceCategory category = (PreferenceCategory) findPreference(getString(categoryKey)); + private String firstLetterCapitalized(String input) { + if (TextUtils.isEmpty(input)) return ""; - if (category != null) { - category.removePreference(preference); - } + return input.substring(0, 1).toUpperCase() + input.substring(1); } /** From 36969fe01c35ede5cef604288f34828b59f1ec55 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 10:59:02 +0100 Subject: [PATCH 36/59] Fixing crash on pre-21 API devices. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 2 +- .../res/drawable-v21/dialog_info_button_background.xml | 8 ++++++++ .../main/res/drawable/dialog_info_button_background.xml | 8 ++++++++ .../src/main/res/layout/detail_list_preference_title.xml | 3 ++- WordPress/src/main/res/values/dimens.xml | 4 ++-- 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 WordPress/src/main/res/drawable-v21/dialog_info_button_background.xml create mode 100644 WordPress/src/main/res/drawable/dialog_info_button_background.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 f746944e25d4..73bcc896cc1d 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 @@ -393,9 +393,9 @@ private void changeEditTextPreferenceValue(EditTextPreference pref, String newVa private void changeLanguageValue(String newValue) { if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { mLanguagePreference.setValue(newValue); - // TODO: set summary in selected locale mLanguagePreference.setSummary(getLanguageString(newValue, new Locale(newValue))); + // update details to display in selected locale String[] languageCodes = getResources().getStringArray(R.array.language_codes); mLanguagePreference.setEntries(createLanguageDisplayStrings(languageCodes)); mLanguagePreference.setDetails(createLanguageDetailDisplayStrings(languageCodes, newValue)); diff --git a/WordPress/src/main/res/drawable-v21/dialog_info_button_background.xml b/WordPress/src/main/res/drawable-v21/dialog_info_button_background.xml new file mode 100644 index 000000000000..3ba16d9a2fec --- /dev/null +++ b/WordPress/src/main/res/drawable-v21/dialog_info_button_background.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/WordPress/src/main/res/drawable/dialog_info_button_background.xml b/WordPress/src/main/res/drawable/dialog_info_button_background.xml new file mode 100644 index 000000000000..e86873f6bc11 --- /dev/null +++ b/WordPress/src/main/res/drawable/dialog_info_button_background.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index fd8ff61f5b30..0df5d475a2cc 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -15,6 +15,7 @@ 16dp 4dp - 0dp - 12dp + 6dp + 6dp 4dp 4dp 4dp From 7ea9be0c99efc22a84c0e4879287ac2ca21c1938 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 11:09:33 +0100 Subject: [PATCH 37/59] RTL adjustments and handling region-encoded language codes. --- .../android/ui/prefs/SiteSettingsFragment.java | 16 +++++++++++----- .../main/res/layout/detail_list_preference.xml | 1 + 2 files changed, 12 insertions(+), 5 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 73bcc896cc1d..be38398bf1da 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 @@ -305,7 +305,7 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { changeLanguageValue(mRemoteLanguage); mLanguagePreference.setSummary( firstLetterCapitalized( - getLanguageString(mRemoteLanguage, new Locale(mRemoteLanguage)))); + getLanguageString(mRemoteLanguage, new Locale(localeInput(mRemoteLanguage))))); } mRemotePrivacy = settingsObject.optInt("blog_public"); @@ -393,7 +393,7 @@ private void changeEditTextPreferenceValue(EditTextPreference pref, String newVa private void changeLanguageValue(String newValue) { if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { mLanguagePreference.setValue(newValue); - mLanguagePreference.setSummary(getLanguageString(newValue, new Locale(newValue))); + mLanguagePreference.setSummary(getLanguageString(newValue, new Locale(localeInput(newValue)))); // update details to display in selected locale String[] languageCodes = getResources().getStringArray(R.array.language_codes); @@ -436,7 +436,7 @@ private String[] createLanguageDisplayStrings(CharSequence[] languageCodes) { for (int i = 0; i < languageCodes.length; ++i) { displayStrings[i] = firstLetterCapitalized(getLanguageString( - String.valueOf(languageCodes[i]), new Locale(languageCodes[i].toString()))); + String.valueOf(languageCodes[i]), new Locale(localeInput(languageCodes[i].toString())))); } return displayStrings; @@ -452,7 +452,7 @@ public String[] createLanguageDetailDisplayStrings(String[] languageCodes, Strin String[] detailStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { detailStrings[i] = firstLetterCapitalized( - getLanguageString(languageCodes[i], new Locale(locale))); + getLanguageString(languageCodes[i], new Locale(localeInput(locale)))); } return detailStrings; @@ -466,7 +466,7 @@ private String getLanguageString(String languageCode, Locale displayLocale) { return ""; } - Locale languageLocale = new Locale(languageCode.substring(0, 2)); + Locale languageLocale = new Locale(localeInput(languageCode)); return languageLocale.getDisplayLanguage(displayLocale) + languageCode.substring(2); } @@ -498,6 +498,12 @@ private String convertLanguageIdToLanguageCode(String id) { return ""; } + private String localeInput(String languageCode) { + if (TextUtils.isEmpty(languageCode)) return ""; + + return languageCode.substring(0, 2); + } + /** * Helper method to get a value from a nested Map. Used to parse self-hosted response object. */ diff --git a/WordPress/src/main/res/layout/detail_list_preference.xml b/WordPress/src/main/res/layout/detail_list_preference.xml index 65eec3160f9a..8ea0c4f5a4fb 100644 --- a/WordPress/src/main/res/layout/detail_list_preference.xml +++ b/WordPress/src/main/res/layout/detail_list_preference.xml @@ -44,6 +44,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_sz_small" android:textColor="@color/grey_darken_10" + android:gravity="left" style="@style/Calypso.TextAppearance" tools:text="Detail Text" /> From dcedfab4939f1fed4d1129c5e0cb629d4360c7ef Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 11:56:40 +0100 Subject: [PATCH 38/59] Setting self-hosted changes to title and tagline. --- .../ui/prefs/SiteSettingsFragment.java | 144 +++++++++++++----- 1 file changed, 103 insertions(+), 41 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 be38398bf1da..f2201296c901 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 @@ -7,6 +7,7 @@ import android.preference.PreferenceFragment; import android.support.annotation.NonNull; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -93,17 +94,6 @@ public void onDestroy() { applyChanges(); } - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putString("remote-title", mRemoteTitle); - outState.putString("remote-tagline", mRemoteTagline); - outState.putString("remote-address", mRemoteAddress); - outState.putInt("remote-privacy", mRemotePrivacy); - outState.putString("remote-language", mRemoteLanguage); - } - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -235,17 +225,18 @@ public void onErrorResponse(VolleyError error) { }); } else { // self-hosted settings - XMLRPCClientInterface client = XMLRPCFactory.instantiate(mBlog.getUri(), - mBlog.getHttpuser(), - mBlog.getHttppassword()); Object[] params = { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() }; - client.callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); + instantiateInterface().callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); } } + private XMLRPCClientInterface instantiateInterface() { + return XMLRPCFactory.instantiate(mBlog.getUri(), mBlog.getHttpuser(), mBlog.getHttppassword()); + } + private void handleSettingsFetchError(String error) { AppLog.w(AppLog.T.API, "Error GETing site settings: " + error); if (isAdded()) { @@ -323,7 +314,7 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { * Using undocumented endpoint WPCOM_JSON_API_Site_Settings_Endpoint * https://wpcom.trac.automattic.com/browser/trunk/public.api/rest/json-endpoints.php#L1903 */ - private HashMap generatePostParams() { + private HashMap generateDotComPostParams() { HashMap params = new HashMap<>(); if (mTitlePreference != null && !mTitlePreference.getText().equals(mRemoteTitle)) { @@ -351,32 +342,62 @@ private HashMap generatePostParams() { return params; } + private HashMap generateSelfHostedParams() { + HashMap params = new HashMap<>(); + + if (mTitlePreference != null && !mTitlePreference.getText().equals(mRemoteTitle)) { + params.put("blog_title", mTitlePreference.getText()); + } + + if (mTaglinePreference != null && !mTaglinePreference.getText().equals(mRemoteTagline)) { + params.put("blog_tagline", mTaglinePreference.getText()); + } + + return params; + } + /** * Persists changed settings remotely */ private void applyChanges() { - final HashMap params = generatePostParams(); + if (mBlog.isDotcomFlag()) { + postDotComChanges(generateDotComPostParams()); + } else { + postSelfHostedChanges(generateSelfHostedParams()); + } + } - 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")); - } + private void postSelfHostedChanges(final HashMap params) { + if (params == null || params.size() == 0) return; + + Object[] callParams = { + mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword(), params + }; + + instantiateInterface().callAsync(mXmlRpcSetCallback, "wp.setOptions", callParams); + } + + private void postDotComChanges(final HashMap params) { + if (params == null || params.size() == 0) return; + + 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) { - AppLog.w(AppLog.T.API, "Error POSTing site settings changes: " + error); - if (isAdded()) { - ToastUtils.showToast(getActivity(), getString(R.string.error_post_remote_site_settings)); - } + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + 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); - } + } + }, params); } /** @@ -542,12 +563,53 @@ public void run() { @Override public void onFailure(long id, final Exception error) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - handleSettingsFetchError(error.toString()); - } - }); + if (isAdded()) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleSettingsFetchError(error.toString()); + } + }); + } + } + }; + + private final XMLRPCCallback mXmlRpcSetCallback = new XMLRPCCallback() { + @Override + public void onSuccess(long id, final Object result) { + if (result instanceof Map) { + handleResponseToSelfHostedSettingsSetRequest((Map) result); + } else { + // Response is considered an error if we are unable to parse it + handleSettingsSetError("Invalid response object (expected Map): " + result); + } + } + + @Override + public void onFailure(long id, final Exception error) { + if (isAdded()) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleSettingsSetError(error.toString()); + } + }); + } } }; + + private void handleResponseToSelfHostedSettingsSetRequest(Map result) { + AppLog.w(AppLog.T.API, "Site settings saved"); + for (Object key : result.keySet()) { + Log.d("", "key=" + key + "; value=" + result.get(key)); + } + } + + private void handleSettingsSetError(String error) { + AppLog.w(AppLog.T.API, "Error setting site settings: " + error); + if (isAdded()) { + ToastUtils.showToast(getActivity(), getString(R.string.error_post_remote_site_settings)); + getActivity().finish(); + } + } } From 703bc28f374b4732f5a76de47baae65deca595d1 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 16:04:45 +0100 Subject: [PATCH 39/59] Updating to use method string constants. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 5 +++-- WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java | 2 ++ .../src/main/java/org/xmlrpc/android/XMLRPCClient.java | 6 +++--- 3 files changed, 8 insertions(+), 5 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 f2201296c901..3bd9a7bfc532 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 @@ -27,6 +27,7 @@ import org.wordpress.android.util.MapUtils; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; +import org.xmlrpc.android.ApiHelper; import org.xmlrpc.android.XMLRPCCallback; import org.xmlrpc.android.XMLRPCClientInterface; import org.xmlrpc.android.XMLRPCFactory; @@ -229,7 +230,7 @@ public void onErrorResponse(VolleyError error) { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword() }; - instantiateInterface().callAsync(mXmlRpcFetchCallback, "wp.getOptions", params); + instantiateInterface().callAsync(mXmlRpcFetchCallback, ApiHelper.Methods.GET_OPTIONS, params); } } @@ -374,7 +375,7 @@ private void postSelfHostedChanges(final HashMap params) { mBlog.getRemoteBlogId(), mBlog.getUsername(), mBlog.getPassword(), params }; - instantiateInterface().callAsync(mXmlRpcSetCallback, "wp.setOptions", callParams); + instantiateInterface().callAsync(mXmlRpcSetCallback, ApiHelper.Methods.SET_OPTIONS, callParams); } private void postDotComChanges(final HashMap params) { diff --git a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java index 9a18787c52c8..e2edc60aa46b 100644 --- a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java +++ b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java @@ -67,6 +67,8 @@ public static final class Methods { public static final String EDIT_POST = "wp.editPost"; public static final String EDIT_COMMENT = "wp.editComment"; + public static final String SET_OPTIONS = "wp.setOptions"; + public static final String UPLOAD_FILE = "wp.uploadFile"; public static final String WPCOM_GET_FEATURES = "wpcom.getFeatures"; diff --git a/WordPress/src/main/java/org/xmlrpc/android/XMLRPCClient.java b/WordPress/src/main/java/org/xmlrpc/android/XMLRPCClient.java index 4ffffa089163..317465832682 100644 --- a/WordPress/src/main/java/org/xmlrpc/android/XMLRPCClient.java +++ b/WordPress/src/main/java/org/xmlrpc/android/XMLRPCClient.java @@ -337,7 +337,7 @@ private static void consumeHttpEntity(HttpEntity entity) { public void preparePostMethod(String method, Object[] params, File tempFile) throws IOException, XMLRPCException, IllegalArgumentException, IllegalStateException { // prepare POST body - if (method.equals("wp.uploadFile")) { + if (method.equals(ApiHelper.Methods.UPLOAD_FILE)) { if (!tempFile.exists() && !tempFile.mkdirs()) { throw new XMLRPCException("Path to file could not be created."); } @@ -511,7 +511,7 @@ private Object callXMLRPC(String method, Object[] params, File tempFile) if (!TextUtils.isEmpty(responseString) && responseString.contains("php fatal error") && responseString.contains("bytes exhausted")) { String newErrorMsg; - if (method.equals("wp.uploadFile")) { + if (method.equals(ApiHelper.Methods.UPLOAD_FILE)) { newErrorMsg = "The server doesn't have enough memory to upload this file. You may need to increase the PHP memory limit on your site."; } else { @@ -613,7 +613,7 @@ private boolean checkXMLRPCErrorMessage(Exception exception) { private void deleteTempFile(String method, File tempFile) { if (tempFile != null) { - if ((method.equals("wp.uploadFile"))){ //get rid of the temp file + if ((method.equals(ApiHelper.Methods.UPLOAD_FILE))){ //get rid of the temp file tempFile.delete(); } } From 1fd0488052412acaadf7771a055e02ed7d4dd280 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 16:20:11 +0100 Subject: [PATCH 40/59] Using resources for DetailListPreference title layout. --- .../layout/detail_list_preference_title.xml | 18 +++++++++--------- WordPress/src/main/res/values/dimens.xml | 7 +++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index 0df5d475a2cc..49689d655e1a 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -2,12 +2,12 @@ @@ -27,10 +27,10 @@ android:background="@drawable/dialog_info_button_background" android:src="@drawable/stats_icon_info" android:tint="@color/grey" - android:padding="8dp" + android:padding="@dimen/dlp_title_logo_padding" android:visibility="gone" - android:layout_width="36dp" - android:layout_height="36dp" + android:layout_width="@dimen/dlp_title_logo_width" + android:layout_height="@dimen/dlp_title_logo_height" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index bb801fa022a9..b3ed1f85a4c3 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -132,6 +132,13 @@ 4dp 4dp 4dp + 24dp + 24dp + 12dp + 12dp + 8dp + 36dp + 36dp 2dp From 89b635bda6d5ff47151fec1dc5c3676a613e679f Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 5 Aug 2015 16:22:01 +0100 Subject: [PATCH 41/59] Using start instead of left in DetailListPreference layout. --- WordPress/src/main/res/layout/detail_list_preference.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/res/layout/detail_list_preference.xml b/WordPress/src/main/res/layout/detail_list_preference.xml index 8ea0c4f5a4fb..ce583f496291 100644 --- a/WordPress/src/main/res/layout/detail_list_preference.xml +++ b/WordPress/src/main/res/layout/detail_list_preference.xml @@ -34,7 +34,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_sz_large" android:textColor="@color/grey_dark" - android:gravity="left" + android:gravity="start" style="@style/Calypso.Text.Header" tools:text="Main Text" /> @@ -44,7 +44,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_sz_small" android:textColor="@color/grey_darken_10" - android:gravity="left" + android:gravity="start" style="@style/Calypso.TextAppearance" tools:text="Detail Text" /> From e230cc3fea0f55d186225d511ae5c2e81adf0b3b Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 6 Aug 2015 11:14:37 +0100 Subject: [PATCH 42/59] Using string resource and fixing typo. --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 2 +- WordPress/src/main/res/xml/site_settings.xml | 2 +- 2 files changed, 2 insertions(+), 2 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 3bd9a7bfc532..bdbfe2c9f04f 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 @@ -558,7 +558,7 @@ public void run() { }); } else { // Response is considered an error if we are unable to parse it - handleSettingsFetchError("Invalid response object (exprected Map): " + result); + handleSettingsFetchError("Invalid response object (expected Map): " + result); } } diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 80d9acd0dce9..5c1c5e2d669d 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -33,7 +33,7 @@ android:id="@+id/pref_site_address" android:key="@string/pref_key_site_address" android:title="@string/site_settings_address_title" - android:summary="Fetching URL" + android:summary="@string/site_settings_address_default_summary" app:summaryLines="1" app:maxSummaryLines="1" app:longClickHint="@string/site_address_hint" /> From 03b6d0339b68130bf6a90bbd4be037307868f8d3 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 6 Aug 2015 15:07:34 +0100 Subject: [PATCH 43/59] Adding shadow to Settings action bar with recommended 4dp elevation. --- .../wordpress/android/ui/prefs/BlogPreferencesActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 196b10677980..96c81c5412ce 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 @@ -5,6 +5,7 @@ import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.util.TypedValue; import android.view.MenuItem; import android.widget.Toast; @@ -42,7 +43,7 @@ public void onCreate(Bundle savedInstanceState) { setTitle(R.string.settings); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { - actionBar.setElevation(0.0f); + actionBar.setElevation(getResources().getDimension(R.dimen.appbar_elevation)); actionBar.setDisplayHomeAsUpEnabled(true); } From 39f08ff71597dceeb1906ec89188bafb54b726f9 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 6 Aug 2015 17:23:44 +0100 Subject: [PATCH 44/59] Fixing radio button issue on privacy preference. --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 7 ++++--- 1 file changed, 4 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 bdbfe2c9f04f..1e7498497342 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 @@ -129,7 +129,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { changeLanguageValue(newValue.toString()); return true; } else if (preference == mPrivacyPreference) { - mPrivacyPreference.setSummary(privacyStringForValue(Integer.valueOf(newValue.toString()))); + changePrivacyValue(Integer.valueOf(newValue.toString())); return true; } @@ -304,8 +304,8 @@ private void handleResponseToWPComSettingsRequest(JSONObject response) { if (mPrivacyPreference != null) { mPrivacyPreference.setEnabled(true); mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); + mPrivacyPreference.setSummary(privacyStringForValue(mRemotePrivacy)); } - changePrivacyValue(mRemotePrivacy); } } @@ -426,9 +426,10 @@ private void changeLanguageValue(String newValue) { } private void changePrivacyValue(int newValue) { - if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) == newValue) { + if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) != newValue) { mPrivacyPreference.setValue(String.valueOf(newValue)); mPrivacyPreference.setSummary(privacyStringForValue(newValue)); + mPrivacyPreference.refreshAdapter(); } } From ee1a3079aef7ff3b42fb08237d6a88bd253ecf0c Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 13 Aug 2015 13:37:07 -0700 Subject: [PATCH 45/59] Styling the AlertDialog to better match mock-ups. --- WordPress/src/main/AndroidManifest.xml | 2 +- .../ui/prefs/BlogPreferencesActivity.java | 1 - .../ui/prefs/DetailListPreference.java | 100 +++++++++++------- .../main/res/color/dialog_compound_button.xml | 14 +++ .../res/layout/detail_list_preference.xml | 7 +- .../layout/detail_list_preference_title.xml | 24 +---- WordPress/src/main/res/values/dimens.xml | 4 +- .../src/main/res/values/styles_calypso.xml | 30 +++++- 8 files changed, 110 insertions(+), 72 deletions(-) create mode 100644 WordPress/src/main/res/color/dialog_compound_button.xml diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml index 31ea22c796d3..7f584a7adc39 100644 --- a/WordPress/src/main/AndroidManifest.xml +++ b/WordPress/src/main/AndroidManifest.xml @@ -91,7 +91,7 @@ android:theme="@style/Theme.AppCompat.NoActionBar"/> + + + + + + + + \ No newline at end of file diff --git a/WordPress/src/main/res/layout/detail_list_preference.xml b/WordPress/src/main/res/layout/detail_list_preference.xml index ce583f496291..ba93988c8d44 100644 --- a/WordPress/src/main/res/layout/detail_list_preference.xml +++ b/WordPress/src/main/res/layout/detail_list_preference.xml @@ -14,6 +14,7 @@ android:paddingBottom="@dimen/dlp_padding_bottom"> diff --git a/WordPress/src/main/res/layout/detail_list_preference_title.xml b/WordPress/src/main/res/layout/detail_list_preference_title.xml index 49689d655e1a..48963d4a0372 100644 --- a/WordPress/src/main/res/layout/detail_list_preference_title.xml +++ b/WordPress/src/main/res/layout/detail_list_preference_title.xml @@ -2,38 +2,20 @@ - - - diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index b3ed1f85a4c3..b5060f8a7dbc 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -125,8 +125,8 @@ 3dp - 16dp - 4dp + 18dp + 24dp 6dp 6dp 4dp diff --git a/WordPress/src/main/res/values/styles_calypso.xml b/WordPress/src/main/res/values/styles_calypso.xml index e13895ec4f4e..e7d33bc191df 100644 --- a/WordPress/src/main/res/values/styles_calypso.xml +++ b/WordPress/src/main/res/values/styles_calypso.xml @@ -5,9 +5,33 @@ + + + + + +