From 64536a3a3f12ab543332f262a1c0772f4e8e23a4 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 23 Jun 2015 18:06:43 -0700 Subject: [PATCH 001/250] 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 002/250] 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 003/250] 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 004/250] 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 005/250] 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 006/250] 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 007/250] 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 008/250] 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 009/250] 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 010/250] 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 011/250] 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 012/250] 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 013/250] 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 014/250] 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 015/250] 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 016/250] 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 017/250] 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 018/250] 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 019/250] 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 020/250] 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 021/250] 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 022/250] 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 023/250] 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 024/250] 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 025/250] 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 026/250] 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 027/250] 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 028/250] 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 029/250] 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 030/250] 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 031/250] 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 032/250] 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 033/250] 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 034/250] 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 035/250] 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 036/250] 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 037/250] 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 038/250] 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 039/250] 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 040/250] 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 041/250] 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 042/250] 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 043/250] 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 044/250] 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 045/250] 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 @@ + + + + + + + + + From 9a15a4f052785bb3e6e538aa2926db4ff1845471 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 5 Nov 2015 18:17:04 -0800 Subject: [PATCH 134/250] Updating discussion preferences to new design --- .../ui/prefs/DetailListPreference.java | 2 +- .../ui/prefs/SiteSettingsFragment.java | 35 +++++++-------- .../ui/prefs/SiteSettingsInterface.java | 3 ++ WordPress/src/main/res/values/strings.xml | 13 +++++- WordPress/src/main/res/xml/site_settings.xml | 44 ++++++++----------- 5 files changed, 49 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 fde16b177be9..4197d7a6bcbf 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 @@ -80,7 +80,7 @@ protected void showDialog(Bundle state) { builder.setNegativeButton(res.getString(R.string.cancel).toUpperCase(), this); if (mDetails == null) { - mDetails = new String[getEntries().length]; + mDetails = new String[getEntries() == null ? 1 : getEntries().length]; } mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); 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 93c24f05c500..99232a903b9b 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 @@ -73,15 +73,14 @@ public class SiteSettingsFragment extends PreferenceFragment private WPSwitchPreference mAllowComments; private WPSwitchPreference mSendPingbacks; private WPSwitchPreference mReceivePingbacks; + private WPSwitchPreference mIdentityRequiredPreference; + private WPSwitchPreference mUserAccountRequiredPreference; private DetailListPreference mCloseAfterPreference; private DetailListPreference mSortByPreference; private DetailListPreference mThreadingPreference; private DetailListPreference mPagingPreference; - private WPSwitchPreference mManualApprovalPreference; - private WPSwitchPreference mIdentityRequiredPreference; - private WPSwitchPreference mUserAccountRequiredPreference; - private WPSwitchPreference mWhitelistPreference; - private WPSwitchPreference mMultipleLinksPreference; + private DetailListPreference mWhitelistPreference; + private WPPreference mMultipleLinksPreference; private DetailListPreference mModerationHoldPreference; private DetailListPreference mBlacklistPreference; @@ -246,9 +245,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mPagingPreference) { return true; - } else if (preference == mManualApprovalPreference) { - mSiteSettings.setManualApproval((Boolean) newValue); - return true; } else if (preference == mIdentityRequiredPreference) { mSiteSettings.setIdentityRequired((Boolean) newValue); return true; @@ -256,14 +252,15 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setUserAccountRequired((Boolean) newValue); return true; } else if (preference == mWhitelistPreference) { - mSiteSettings.setUseCommentWhitelist((Boolean) newValue); +// mSiteSettings.setUseCommentWhitelist((Boolean) newValue); return true; } else if (preference == mMultipleLinksPreference) { - mSiteSettings.setMultipleLinks((Boolean) newValue ? 1 : 0); +// mSiteSettings.setMultipleLinks((Boolean) newValue ? 1 : 0); return true; } else if (preference == mModerationHoldPreference) { return true; } else if (preference == mBlacklistPreference) { + return true; } else if (preference == mUsernamePreference) { mSiteSettings.setUsername(newValue.toString()); changeEditTextPreferenceValue(mUsernamePreference, mSiteSettings.getUsername()); @@ -368,15 +365,14 @@ private void initPreferences() { mAllowComments = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments); mSendPingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks); mReceivePingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks); + mIdentityRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_identity_required); + mUserAccountRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_user_account_required); mCloseAfterPreference = (DetailListPreference) getPref(R.string.pref_key_site_close_after); mSortByPreference = (DetailListPreference) getPref(R.string.pref_key_site_sort_by); mThreadingPreference = (DetailListPreference) getPref(R.string.pref_key_site_threading); mPagingPreference = (DetailListPreference) getPref(R.string.pref_key_site_paging); - mManualApprovalPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_manual_approval); - mIdentityRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_identity_required); - mUserAccountRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_user_account_required); - mWhitelistPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_whitelist); - mMultipleLinksPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_multiple_links); + mWhitelistPreference = (DetailListPreference) getPref(R.string.pref_key_site_whitelist); + mMultipleLinksPreference = (WPPreference) getPref(R.string.pref_key_site_multiple_links); mModerationHoldPreference = (DetailListPreference) getPref(R.string.pref_key_site_moderation_hold); mBlacklistPreference = (DetailListPreference) getPref(R.string.pref_key_site_blacklist); mRelatedPostsPreference = findPreference(getString(R.string.pref_key_site_related_posts)); @@ -419,15 +415,14 @@ private void setPreferencesFromSiteSettings() { mAllowComments.setChecked(mSiteSettings.getAllowComments()); mSendPingbacks.setChecked(mSiteSettings.getSendPingbacks()); mReceivePingbacks.setChecked(mSiteSettings.getReceivePingbacks()); + mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); + mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); mCloseAfterPreference.setValue(String.valueOf(mSiteSettings.getCloseAfter())); mSortByPreference.setValue(String.valueOf(mSiteSettings.getCommentSorting())); mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); mPagingPreference.setValue(String.valueOf(mSiteSettings.getPagingCount())); - mManualApprovalPreference.setChecked(mSiteSettings.getManualApproval()); - mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); - mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); - mWhitelistPreference.setChecked(mSiteSettings.getUseCommentWhitelist()); - mMultipleLinksPreference.setChecked(mSiteSettings.getMultipleLinks() >= 0); +// mWhitelistPreference.setChecked(mSiteSettings.getUseCommentWhitelist()); +// mMultipleLinksPreference.setChecked(mSiteSettings.getMultipleLinks() >= 0); mModerationHoldPreference.setValue(mSiteSettings.getModerationKeys().toString()); mBlacklistPreference.setValue(mSiteSettings.getBlacklistKeys().toString()); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java index d10a464fc240..8e8caf11ed2e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java @@ -16,6 +16,7 @@ import org.xmlrpc.android.XMLRPCClientInterface; import org.xmlrpc.android.XMLRPCFactory; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -395,6 +396,7 @@ public void setModerationKeys(List keys) { } public List getModerationKeys() { + if (mSettings.holdForModeration == null) return new ArrayList<>(); return mSettings.holdForModeration; } @@ -403,6 +405,7 @@ public void setBlacklistKeys(List keys) { } public List getBlacklistKeys() { + if (mSettings.blacklist == null) return new ArrayList<>(); return mSettings.blacklist; } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 2d7a9148f875..3a333c3b9fef 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -485,8 +485,9 @@ Must include name and email Users must be signed in Automatically approve comments - From known users + Automatically approve With multiple links + Require manual approval for more than %d links Hold for Moderation Blacklist Start Over @@ -533,6 +534,16 @@ in \"Upgrade\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the moderation queue. You can enter partial words, so \"press\" will match \"WordPress.\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. You can enter partial words, so \"press\" will match \"WordPress.\" + + No comments + Comments from users who have a previously approved comment + Comments from all users + + + Require manual approval for everyone\'s comments. + Automatically approve if the user has a previously approved comment. + Automatically approve everyone\'s comments. + Never One day diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 07d685c226fc..97cfba546adc 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -162,6 +162,18 @@ android:id="@+id/pref_site_comments" android:title="@string/site_settings_comments_header"> + + + + - - - - - - - - - - - - Date: Thu, 5 Nov 2015 18:21:04 -0800 Subject: [PATCH 135/250] Fixing strings --- 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 3a333c3b9fef..33240f8e0a5a 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -536,8 +536,8 @@ When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. You can enter partial words, so \"press\" will match \"WordPress.\" No comments - Comments from users who have a previously approved comment - Comments from all users + Known users\' comments + All users Require manual approval for everyone\'s comments. From 560e1c1ed3ebe286c0d18e30b89604c20a9ed1c7 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 5 Nov 2015 19:12:06 -0800 Subject: [PATCH 136/250] Filling out summary for settings that use DetailListPreference --- .../android/ui/prefs/DotComSiteSettings.java | 16 ++-- .../ui/prefs/SiteSettingsFragment.java | 78 ++++++++++++++++++- .../ui/prefs/SiteSettingsInterface.java | 3 + WordPress/src/main/res/values/strings.xml | 37 +++++++-- WordPress/src/main/res/xml/site_settings.xml | 20 ++--- 5 files changed, 126 insertions(+), 28 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index 093e3b221393..fbbf7d776ee0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -21,13 +21,6 @@ class DotComSiteSettings extends SiteSettingsInterface { // WP.com REST keys used in response to a settings GET and POST request - public static final String GET_TITLE_KEY = "name"; - public static final String GET_DESC_KEY = "description"; - - // WP.com REST keys used to POST updates to site settings - private static final String SET_TITLE_KEY = "blogname"; - private static final String SET_DESC_KEY = "blogdescription"; - public static final String LANGUAGE_ID_KEY = "lang_id"; public static final String PRIVACY_KEY = "blog_public"; public static final String URL_KEY = "URL"; @@ -48,17 +41,20 @@ class DotComSiteSettings extends SiteSettingsInterface { public static final String MODERATION_KEYS_KEY = "moderation_keys"; public static final String BLACKLIST_KEYS_KEY = "blacklist_keys"; public static final String CLOSE_OLD_COMMENTS_KEY = "close_comments_for_old_posts"; - public static final String CLOSE_OLD_COMMENTS_DAYS_KEY = "close_comments_day_old"; + public static final String CLOSE_OLD_COMMENTS_DAYS_KEY = "close_comments_days_old"; public static final String THREAD_COMMENTS_KEY = "thread_comments"; public static final String THREAD_COMMENTS_DEPTH_KEY = "thread_comments_depth"; public static final String PAGE_COMMENTS_KEY = "page_comments"; public static final String PAGE_COMMENT_COUNT_KEY = "comments_per_page"; public static final String COMMENT_SORT_ORDER_KEY = "comment_order"; - public static final int ASCENDING_SORT = 0; - public static final int DESCENDING_SORT = 1; + // WP.com REST keys used to GET certain site settings + public static final String GET_TITLE_KEY = "name"; + public static final String GET_DESC_KEY = "description"; // WP.com REST keys used to POST updates to site settings + private static final String SET_TITLE_KEY = "blogname"; + private static final String SET_DESC_KEY = "blogdescription"; // WP.com REST keys used in response to a categories GET request private static final String CAT_ID_KEY = "ID"; 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 99232a903b9b..24e96519d813 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,6 +26,7 @@ import android.widget.ListView; import android.widget.TextView; +import org.apache.commons.lang.ArrayUtils; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; @@ -238,8 +239,14 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setReceivePingbacks((Boolean) newValue); return true; } else if (preference == mCloseAfterPreference) { + mSiteSettings.setCloseAfter(Integer.parseInt(newValue.toString())); + mCloseAfterPreference.setValue(newValue.toString()); + mCloseAfterPreference.refreshAdapter(); return true; } else if (preference == mSortByPreference) { + mSiteSettings.setCommentSorting(Integer.parseInt(newValue.toString())); + mSortByPreference.setValue(newValue.toString()); + mSortByPreference.refreshAdapter(); return true; } else if (preference == mThreadingPreference) { return true; @@ -417,14 +424,79 @@ private void setPreferencesFromSiteSettings() { mReceivePingbacks.setChecked(mSiteSettings.getReceivePingbacks()); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); - mCloseAfterPreference.setValue(String.valueOf(mSiteSettings.getCloseAfter())); - mSortByPreference.setValue(String.valueOf(mSiteSettings.getCommentSorting())); mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); mPagingPreference.setValue(String.valueOf(mSiteSettings.getPagingCount())); // mWhitelistPreference.setChecked(mSiteSettings.getUseCommentWhitelist()); -// mMultipleLinksPreference.setChecked(mSiteSettings.getMultipleLinks() >= 0); mModerationHoldPreference.setValue(mSiteSettings.getModerationKeys().toString()); mBlacklistPreference.setValue(mSiteSettings.getBlacklistKeys().toString()); + + int closeAfterPeriod = mSiteSettings.getCloseAfter(); + if (ArrayUtils.contains(mCloseAfterPreference.getEntryValues(), String.valueOf(closeAfterPeriod))) { + mCloseAfterPreference.setValue(String.valueOf(closeAfterPeriod)); + } else { + mCloseAfterPreference.setValue(null); + } + switch (closeAfterPeriod) { + case 0: + mCloseAfterPreference.setSummary("Never"); + break; + case 1: + mCloseAfterPreference.setSummary("1 day"); + break; + default: + mCloseAfterPreference.setSummary(String.format("%d days", closeAfterPeriod)); + break; + } + mCloseAfterPreference.refreshAdapter(); + + int threadingDepth = mSiteSettings.getThreadingLevels(); + if (ArrayUtils.contains(mThreadingPreference.getEntryValues(), String.valueOf(threadingDepth))) { + mThreadingPreference.setValue(String.valueOf(threadingDepth)); + } else { + mThreadingPreference.setValue(null); + } + switch (threadingDepth) { + case 0: + case 1: + mThreadingPreference.setSummary("None"); + break; + default: + mThreadingPreference.setSummary(String.format("%d levels", threadingDepth)); + break; + } + mThreadingPreference.refreshAdapter(); + + int pagingSize = mSiteSettings.getPagingCount(); + if (ArrayUtils.contains(mPagingPreference.getEntryValues(), String.valueOf(pagingSize))) { + mPagingPreference.setValue(String.valueOf(pagingSize)); + } else { + mPagingPreference.setValue(null); + } + switch (pagingSize) { + case 0: + mPagingPreference.setSummary("None"); + break; + case 1: + mPagingPreference.setSummary("1 comment per page"); + break; + default: + mPagingPreference.setSummary(String.format("%d comments per page", pagingSize)); + break; + } + mPagingPreference.refreshAdapter(); + + int sortOrder = mSiteSettings.getCommentSorting(); + String sortOrderString = String.valueOf(sortOrder); + if (!ArrayUtils.contains(mSortByPreference.getEntryValues(), sortOrderString)) { + sortOrderString = String.valueOf(sortOrder = SiteSettingsInterface.ASCENDING_SORT); + } + mSortByPreference.setValue(sortOrderString); + if (sortOrder == SiteSettingsInterface.ASCENDING_SORT) { + mSortByPreference.setSummary("Oldest first"); + } else { + mSortByPreference.setSummary("Newest first"); + } + mSortByPreference.refreshAdapter(); } private void setCategories() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java index 8e8caf11ed2e..111cc8955c08 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java @@ -44,6 +44,9 @@ public abstract class SiteSettingsInterface { public static final String DEF_CATEGORY_PREF_KEY = "site-settings-category-pref"; public static final String DEF_FORMAT_PREF_KEY = "site-settings-format-pref"; + public static final int ASCENDING_SORT = 0; + public static final int DESCENDING_SORT = 1; + private static final String STANDARD_POST_FORMAT = "standard"; /** diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 33240f8e0a5a..619d4a33d70e 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -534,38 +534,65 @@ in \"Upgrade\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the moderation queue. You can enter partial words, so \"press\" will match \"WordPress.\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. You can enter partial words, so \"press\" will match \"WordPress.\" - + No comments Known users\' comments All users + + -1 + 0 + 1 + Require manual approval for everyone\'s comments. Automatically approve if the user has a previously approved comment. Automatically approve everyone\'s comments. - + Never One day One week One month - + + 0 + 1 + 7 + 30 + + Oldest first Newest first - + + 0 + 1 + + Two levels Three levels Four levels Five levels - + + 2 + 3 + 4 + 5 + + None 50 comments per page 100 comments per page 200 comments per page + + 0 + 50 + 100 + 200 + Open source licenses diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 97cfba546adc..0a9228fa0d93 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -178,40 +178,40 @@ android:id="@+id/pref_close_after" android:key="@string/pref_key_site_close_after" android:title="@string/site_settings_close_after_title" - android:entries="@array/site_settings_close_after_options" - android:entryValues="@array/site_settings_close_after_options" + android:entries="@array/site_settings_close_after_entries" + android:entryValues="@array/site_settings_close_after_values" app:longClickHint="@string/site_close_after_hint" /> From cebe2fd71f9a985030ecb3eabd45bfbbd47bdd3c Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 5 Nov 2015 19:13:40 -0800 Subject: [PATCH 137/250] Saving DetailListPreference settings remotely if changed --- .../android/ui/prefs/DotComSiteSettings.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index fbbf7d776ee0..64f10ddd3dfd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -237,22 +237,22 @@ public Map serializeDotComParams() { if (mSettings.commentApprovalRequired != mRemoteSettings.commentApprovalRequired) { params.put(COMMENT_MODERATION_KEY, String.valueOf(mSettings.commentApprovalRequired)); } -// if (mSettings.closeCommentAfter != mRemoteSettings.closeCommentAfter) { -// params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); -// } -// if (mSettings.sortCommentsBy != mRemoteSettings.sortCommentsBy) { -// if (mSettings.sortCommentsBy == ASCENDING_SORT) { -// params.put(COMMENT_SORT_ORDER_KEY, "asc"); -// } else if (mSettings.sortCommentsBy == DESCENDING_SORT) { -// params.put(COMMENT_SORT_ORDER_KEY, "desc"); -// } -// } -// if (mSettings.threadingLevels != mRemoteSettings.threadingLevels) { -// params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); -// } -// if (mSettings.commentsPerPage != mRemoteSettings.commentsPerPage) { -// params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); -// } + if (mSettings.closeCommentAfter != mRemoteSettings.closeCommentAfter) { + params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); + } + if (mSettings.sortCommentsBy != mRemoteSettings.sortCommentsBy) { + if (mSettings.sortCommentsBy == ASCENDING_SORT) { + params.put(COMMENT_SORT_ORDER_KEY, "asc"); + } else if (mSettings.sortCommentsBy == DESCENDING_SORT) { + params.put(COMMENT_SORT_ORDER_KEY, "desc"); + } + } + if (mSettings.threadingLevels != mRemoteSettings.threadingLevels) { + params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); + } + if (mSettings.commentsPerPage != mRemoteSettings.commentsPerPage) { + params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); + } if (mSettings.commentsRequireIdentity != mRemoteSettings.commentsRequireIdentity) { params.put(REQUIRE_IDENTITY_KEY, String.valueOf(mSettings.commentsRequireIdentity)); } From f5453130d4087cb25c2b1caf7a30cdeaa0c673b4 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 6 Nov 2015 19:15:19 -0800 Subject: [PATCH 138/250] Learn More button now opens support document in a dialog --- .../android/ui/prefs/LearnMorePreference.java | 80 +++++++++++++++++++ .../src/main/res/layout/learn_more_pref.xml | 37 +++++++++ .../res/layout/learn_more_pref_screen.xml | 21 +++++ WordPress/src/main/res/values/strings.xml | 3 + WordPress/src/main/res/xml/site_settings.xml | 5 +- 5 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java create mode 100644 WordPress/src/main/res/layout/learn_more_pref.xml create mode 100644 WordPress/src/main/res/layout/learn_more_pref_screen.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java new file mode 100644 index 000000000000..0ea80c3ab8bf --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java @@ -0,0 +1,80 @@ +package org.wordpress.android.ui.prefs; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.preference.Preference; +import android.support.annotation.NonNull; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import org.wordpress.android.R; + +public class LearnMorePreference extends Preference + implements PreferenceHint, View.OnClickListener, DialogInterface.OnDismissListener { + private static final String WP_SUPPORT_URL = "https://en.support.wordpress.com/settings/discussion-settings/#default-article-settings"; + + private String mHint; + private Dialog mDialog; + + public LearnMorePreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected View onCreateView(@NonNull ViewGroup parent) { + super.onCreateView(parent); + + View view = View.inflate(getContext(), R.layout.learn_more_pref, null); + view.findViewById(R.id.learnMoreButton).setOnClickListener(this); + + return view; + } + + @Override + public void onClick(View v) { + if (mDialog != null) return; + + Context context = getContext(); + Dialog dialog = mDialog = new Dialog(context); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setOnDismissListener(this); + WebView webView = new WebView(context); + webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + }); + webView.loadUrl(WP_SUPPORT_URL); + dialog.setContentView(webView); + dialog.show(); + webView.requestFocus(); + } + + @Override + public void onDismiss(DialogInterface dialog) { + mDialog = null; + } + + @Override + public boolean hasHint() { + return !TextUtils.isEmpty(mHint); + } + + @Override + public String getHint() { + return mHint; + } + + @Override + public void setHint(String hint) { + mHint = hint; + } +} diff --git a/WordPress/src/main/res/layout/learn_more_pref.xml b/WordPress/src/main/res/layout/learn_more_pref.xml new file mode 100644 index 000000000000..5c04a1f39b81 --- /dev/null +++ b/WordPress/src/main/res/layout/learn_more_pref.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/WordPress/src/main/res/layout/learn_more_pref_screen.xml b/WordPress/src/main/res/layout/learn_more_pref_screen.xml new file mode 100644 index 000000000000..9ba4d3559db0 --- /dev/null +++ b/WordPress/src/main/res/layout/learn_more_pref_screen.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 619d4a33d70e..b155a8d37409 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -521,6 +521,9 @@ Show related content after posts Disconnected, editing disabled. Site settings updated + In the Default article settings, there are three options. These settings are defaults for new posts or pages, which can always be changed individually on each article. + The Allow Comment option allows you to enable or disable comments by default. + You can override thee settings for individual posts. Show Related Posts Related Posts displays relevant content from your site below your posts. Show Header diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 0a9228fa0d93..b1499175a26e 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -150,11 +150,10 @@ android:title="@string/site_settings_receive_pingbacks_title" app:longClickHint="@string/site_receive_pingbacks_hint" /> - + android:title="@string/learn_more" /> From 21a9023769b2f8d60037e2c9b9dd23012fe6b4ab Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 6 Nov 2015 19:54:32 -0800 Subject: [PATCH 139/250] Toggling dangerous preference visibility based on .com flag --- .../android/ui/prefs/SiteSettingsFragment.java | 3 +++ WordPress/src/main/res/values/strings.xml | 4 ++++ WordPress/src/main/res/xml/site_settings.xml | 10 +++++++++- 3 files changed, 16 insertions(+), 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 24e96519d813..e683a128df3c 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 @@ -388,12 +388,15 @@ private void initPreferences() { // .com sites hide the Account category, self-hosted sites hide the Related Posts preference if (mBlog.isDotcomFlag()) { removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_account); + removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_remove_site); } else { removePreference(R.string.pref_key_site_general, R.string.pref_key_site_visibility); removePreference(R.string.pref_key_site_general, R.string.pref_key_site_language); removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_related_posts); removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_category); removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_format); + removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_start_over); + removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_delete_site); } } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index b155a8d37409..0e42abddb9c2 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -453,8 +453,10 @@ wp_pref_site_multiple_links wp_pref_site_moderation_hold wp_pref_site_blacklist + wp_pref_site_danger wp_pref_site_start_over wp_pref_site_delete_site + wp_pref_site_remove_site General @@ -472,6 +474,7 @@ Default Format Related Posts Discussion + Danger! Defaults for New Posts Allow Comments Send Pingbacks @@ -492,6 +495,7 @@ Blacklist Start Over Delete Site + Remove Site 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 diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index b1499175a26e..3276028919f6 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -238,7 +238,10 @@ - + + + From dfb0aa7143007f2e45f4707505a6d8220642fb61 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 6 Nov 2015 19:58:00 -0800 Subject: [PATCH 140/250] Adding loading indicator for Learn More button --- .../android/ui/prefs/LearnMorePreference.java | 12 ++++++---- .../res/layout/learn_more_pref_screen.xml | 24 ++++++++----------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java index 0ea80c3ab8bf..95a03b226783 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java @@ -44,18 +44,20 @@ public void onClick(View v) { Dialog dialog = mDialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setOnDismissListener(this); + dialog.setContentView(R.layout.learn_more_pref_screen); WebView webView = new WebView(context); webView.setWebViewClient(new WebViewClient() { @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); - return true; + public void onPageFinished(WebView webView, String url) { + super.onPageFinished(webView, url); + + if (mDialog != null) { + mDialog.setContentView(webView); + } } }); webView.loadUrl(WP_SUPPORT_URL); - dialog.setContentView(webView); dialog.show(); - webView.requestFocus(); } @Override diff --git a/WordPress/src/main/res/layout/learn_more_pref_screen.xml b/WordPress/src/main/res/layout/learn_more_pref_screen.xml index 9ba4d3559db0..df367376049b 100644 --- a/WordPress/src/main/res/layout/learn_more_pref_screen.xml +++ b/WordPress/src/main/res/layout/learn_more_pref_screen.xml @@ -1,21 +1,17 @@ - + android:layout_height="match_parent" + android:foregroundGravity="center_horizontal" + android:background="@color/transparent"> - + android:layout_height="match_parent" + android:layout_gravity="center_horizontal" + android:background="@color/transparent" + android:indeterminate="true" /> - - - \ No newline at end of file + From 7368332e0a619bbb8ad9d3242d7d867bcc92c624 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 9 Nov 2015 13:53:25 -0800 Subject: [PATCH 141/250] Showing some discussion settings, adding More button for the rest --- .../res/layout/learn_more_pref_screen.xml | 1 - WordPress/src/main/res/values/strings.xml | 2 + WordPress/src/main/res/xml/site_settings.xml | 246 ++++++++++-------- 3 files changed, 138 insertions(+), 111 deletions(-) diff --git a/WordPress/src/main/res/layout/learn_more_pref_screen.xml b/WordPress/src/main/res/layout/learn_more_pref_screen.xml index df367376049b..e3455db545e1 100644 --- a/WordPress/src/main/res/layout/learn_more_pref_screen.xml +++ b/WordPress/src/main/res/layout/learn_more_pref_screen.xml @@ -11,7 +11,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" - android:background="@color/transparent" android:indeterminate="true" /> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 0e42abddb9c2..1f4351434307 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -441,6 +441,7 @@ wp_pref_site_allow_comments wp_pref_site_send_pingbacks wp_pref_site_receive_pingbacks + wp_pref_site_more_discussion wp_pref_site_learn_more wp_pref_site_close_after wp_pref_site_sort_by @@ -479,6 +480,7 @@ Allow Comments Send Pingbacks Receive Pingbacks + More Comments Close after Sort by diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 3276028919f6..e9569b0201ae 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -122,120 +122,146 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Date: Mon, 9 Nov 2015 14:45:09 -0800 Subject: [PATCH 142/250] Updating preferences shared between both preference screens --- .../ui/prefs/SiteSettingsFragment.java | 42 +++++++++++++++---- WordPress/src/main/res/values/strings.xml | 3 ++ WordPress/src/main/res/xml/site_settings.xml | 6 +-- 3 files changed, 39 insertions(+), 12 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 e683a128df3c..2d50c898d36a 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 @@ -71,8 +71,11 @@ public class SiteSettingsFragment extends PreferenceFragment private DetailListPreference mCategoryPreference; private DetailListPreference mFormatPreference; private Preference mRelatedPostsPreference; + private WPSwitchPreference mAllowCommentsNested; private WPSwitchPreference mAllowComments; + private WPSwitchPreference mSendPingbacksNested; private WPSwitchPreference mSendPingbacks; + private WPSwitchPreference mReceivePingbacksNested; private WPSwitchPreference mReceivePingbacks; private WPSwitchPreference mIdentityRequiredPreference; private WPSwitchPreference mUserAccountRequiredPreference; @@ -229,14 +232,14 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setPrivacy(Integer.valueOf(newValue.toString())); changePrivacyValue(mSiteSettings.getPrivacy()); return true; - } else if (preference == mAllowComments) { - mSiteSettings.setAllowComments((Boolean) newValue); + } else if (preference == mAllowComments || preference == mAllowCommentsNested) { + setAllowComments((Boolean) newValue); return true; - } else if (preference == mSendPingbacks) { - mSiteSettings.setSendPingbacks((Boolean) newValue); + } else if (preference == mSendPingbacks || preference == mSendPingbacksNested) { + setSendPingbacks((Boolean) newValue); return true; - } else if (preference == mReceivePingbacks) { - mSiteSettings.setReceivePingbacks((Boolean) newValue); + } else if (preference == mReceivePingbacks || preference == mReceivePingbacksNested) { + setReceivePingbacks((Boolean) newValue); return true; } else if (preference == mCloseAfterPreference) { mSiteSettings.setCloseAfter(Integer.parseInt(newValue.toString())); @@ -370,8 +373,11 @@ private void initPreferences() { mCategoryPreference = (DetailListPreference) getPref(R.string.pref_key_site_category); mFormatPreference = (DetailListPreference) getPref(R.string.pref_key_site_format); mAllowComments = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments); + mAllowCommentsNested = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments_nested); mSendPingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks); + mSendPingbacksNested = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks_nested); mReceivePingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks); + mReceivePingbacksNested = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks_nested); mIdentityRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_identity_required); mUserAccountRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_user_account_required); mCloseAfterPreference = (DetailListPreference) getPref(R.string.pref_key_site_close_after); @@ -422,9 +428,9 @@ private void setPreferencesFromSiteSettings() { changeLanguageValue(mSiteSettings.getLanguageCode()); setCategories(); setPostFormats(); - mAllowComments.setChecked(mSiteSettings.getAllowComments()); - mSendPingbacks.setChecked(mSiteSettings.getSendPingbacks()); - mReceivePingbacks.setChecked(mSiteSettings.getReceivePingbacks()); + setAllowComments(mSiteSettings.getAllowComments()); + setSendPingbacks(mSiteSettings.getSendPingbacks()); + setReceivePingbacks(mSiteSettings.getReceivePingbacks()); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); @@ -550,6 +556,24 @@ private void setPostFormats() { mFormatPreference.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); } + private void setAllowComments(boolean newValue) { + mSiteSettings.setAllowComments(newValue); + mAllowComments.setChecked(newValue); + mAllowCommentsNested.setChecked(newValue); + } + + private void setSendPingbacks(boolean newValue) { + mSiteSettings.setSendPingbacks(newValue); + if (mSendPingbacks.isChecked() != newValue) mSendPingbacks.setChecked(newValue); + if (mSendPingbacksNested.isChecked() != newValue) mSendPingbacksNested.setChecked(newValue); + } + + private void setReceivePingbacks(boolean newValue) { + mSiteSettings.setReceivePingbacks(newValue); + if (mReceivePingbacks.isChecked() != newValue) mReceivePingbacks.setChecked(newValue); + if (mReceivePingbacksNested.isChecked() != newValue) mReceivePingbacksNested.setChecked(newValue); + } + /** * 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. diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 1f4351434307..6b67de9b1578 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -439,8 +439,11 @@ wp_pref_site_default_format wp_pref_site_discussion wp_pref_site_allow_comments + wp_pref_site_allow_comments_nested wp_pref_site_send_pingbacks + wp_pref_site_send_pingbacks_nested wp_pref_site_receive_pingbacks + wp_pref_site_receive_pingbacks_nested wp_pref_site_more_discussion wp_pref_site_learn_more wp_pref_site_close_after diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index e9569b0201ae..427a7aaf7012 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -158,19 +158,19 @@ From a29c0fc1c03b4ad342086b29325d652aa0c983f4 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 9 Nov 2015 16:09:28 -0800 Subject: [PATCH 143/250] Setting preference default values and cleaning up summaries --- .../ui/prefs/SiteSettingsFragment.java | 180 +++++++++--------- .../ui/prefs/SiteSettingsInterface.java | 13 -- WordPress/src/main/res/values/strings.xml | 19 +- WordPress/src/main/res/xml/site_settings.xml | 8 +- 4 files changed, 109 insertions(+), 111 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 2d50c898d36a..7c21afcb3074 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 android.widget.ListView; import android.widget.TextView; -import org.apache.commons.lang.ArrayUtils; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; @@ -85,8 +84,8 @@ public class SiteSettingsFragment extends PreferenceFragment private DetailListPreference mPagingPreference; private DetailListPreference mWhitelistPreference; private WPPreference mMultipleLinksPreference; - private DetailListPreference mModerationHoldPreference; - private DetailListPreference mBlacklistPreference; + private WPPreference mModerationHoldPreference; + private WPPreference mBlacklistPreference; @Override public void onCreate(Bundle savedInstanceState) { @@ -203,6 +202,11 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen String title = String.valueOf(preference.getTitle()); WPActivityUtils.addToolbarToDialog(this, prefDialog, title); } + } else if (preference == mMultipleLinksPreference) { + } else if (preference == mModerationHoldPreference) { + // TODO: open custom dialog to edit keys + } else if (preference == mBlacklistPreference) { + // TODO: open custom dialog to edit keys } return false; @@ -230,7 +234,9 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mPrivacyPreference) { mSiteSettings.setPrivacy(Integer.valueOf(newValue.toString())); - changePrivacyValue(mSiteSettings.getPrivacy()); + setDetailListPreferenceValue(mPrivacyPreference, + String.valueOf(mSiteSettings.getPrivacy()), + getPrivacySummary(mSiteSettings.getPrivacy())); return true; } else if (preference == mAllowComments || preference == mAllowCommentsNested) { setAllowComments((Boolean) newValue); @@ -243,17 +249,27 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mCloseAfterPreference) { mSiteSettings.setCloseAfter(Integer.parseInt(newValue.toString())); - mCloseAfterPreference.setValue(newValue.toString()); - mCloseAfterPreference.refreshAdapter(); + setDetailListPreferenceValue(mCloseAfterPreference, + newValue.toString(), + getCloseAfterSummary(mSiteSettings.getCloseAfter())); return true; } else if (preference == mSortByPreference) { mSiteSettings.setCommentSorting(Integer.parseInt(newValue.toString())); - mSortByPreference.setValue(newValue.toString()); - mSortByPreference.refreshAdapter(); + setDetailListPreferenceValue(mSortByPreference, + newValue.toString(), + getSortOrderSummary(mSiteSettings.getCommentSorting())); return true; } else if (preference == mThreadingPreference) { + mSiteSettings.setThreadingLevels(Integer.parseInt(newValue.toString())); + setDetailListPreferenceValue(mThreadingPreference, + newValue.toString(), + getThreadingSummary(mSiteSettings.getThreadingLevels())); return true; } else if (preference == mPagingPreference) { + mSiteSettings.setPagingCount(Integer.parseInt(newValue.toString())); + setDetailListPreferenceValue(mPagingPreference, + newValue.toString(), + getPagingSummary(mSiteSettings.getPagingCount())); return true; } else if (preference == mIdentityRequiredPreference) { mSiteSettings.setIdentityRequired((Boolean) newValue); @@ -386,10 +402,12 @@ private void initPreferences() { mPagingPreference = (DetailListPreference) getPref(R.string.pref_key_site_paging); mWhitelistPreference = (DetailListPreference) getPref(R.string.pref_key_site_whitelist); mMultipleLinksPreference = (WPPreference) getPref(R.string.pref_key_site_multiple_links); - mModerationHoldPreference = (DetailListPreference) getPref(R.string.pref_key_site_moderation_hold); - mBlacklistPreference = (DetailListPreference) getPref(R.string.pref_key_site_blacklist); + mModerationHoldPreference = (WPPreference) getPref(R.string.pref_key_site_moderation_hold); + mBlacklistPreference = (WPPreference) getPref(R.string.pref_key_site_blacklist); mRelatedPostsPreference = findPreference(getString(R.string.pref_key_site_related_posts)); mRelatedPostsPreference.setOnPreferenceClickListener(this); + mModerationHoldPreference.setOnPreferenceClickListener(this); + mBlacklistPreference.setOnPreferenceClickListener(this); // .com sites hide the Account category, self-hosted sites hide the Related Posts preference if (mBlog.isDotcomFlag()) { @@ -424,88 +442,33 @@ private void setPreferencesFromSiteSettings() { changeEditTextPreferenceValue(mAddressPreference, mSiteSettings.getAddress()); changeEditTextPreferenceValue(mUsernamePreference, mSiteSettings.getUsername()); changeEditTextPreferenceValue(mPasswordPreference, mSiteSettings.getPassword()); - changePrivacyValue(mSiteSettings.getPrivacy()); - changeLanguageValue(mSiteSettings.getLanguageCode()); + setDetailListPreferenceValue(mPrivacyPreference, + String.valueOf(mSiteSettings.getPrivacy()), + getPrivacySummary(mSiteSettings.getPrivacy())); setCategories(); setPostFormats(); setAllowComments(mSiteSettings.getAllowComments()); setSendPingbacks(mSiteSettings.getSendPingbacks()); setReceivePingbacks(mSiteSettings.getReceivePingbacks()); + setDetailListPreferenceValue(mCloseAfterPreference, + String.valueOf(mSiteSettings.getCloseAfter()), + getCloseAfterSummary(mSiteSettings.getCloseAfter())); + setDetailListPreferenceValue(mSortByPreference, + String.valueOf(mSiteSettings.getCommentSorting()), + getSortOrderSummary(mSiteSettings.getCommentSorting())); + setDetailListPreferenceValue(mThreadingPreference, + String.valueOf(mSiteSettings.getThreadingLevels()), + getThreadingSummary(mSiteSettings.getThreadingLevels())); + setDetailListPreferenceValue(mPagingPreference, + String.valueOf(mSiteSettings.getPagingCount()), + getPagingSummary(mSiteSettings.getPagingCount())); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); mPagingPreference.setValue(String.valueOf(mSiteSettings.getPagingCount())); // mWhitelistPreference.setChecked(mSiteSettings.getUseCommentWhitelist()); - mModerationHoldPreference.setValue(mSiteSettings.getModerationKeys().toString()); - mBlacklistPreference.setValue(mSiteSettings.getBlacklistKeys().toString()); - - int closeAfterPeriod = mSiteSettings.getCloseAfter(); - if (ArrayUtils.contains(mCloseAfterPreference.getEntryValues(), String.valueOf(closeAfterPeriod))) { - mCloseAfterPreference.setValue(String.valueOf(closeAfterPeriod)); - } else { - mCloseAfterPreference.setValue(null); - } - switch (closeAfterPeriod) { - case 0: - mCloseAfterPreference.setSummary("Never"); - break; - case 1: - mCloseAfterPreference.setSummary("1 day"); - break; - default: - mCloseAfterPreference.setSummary(String.format("%d days", closeAfterPeriod)); - break; - } - mCloseAfterPreference.refreshAdapter(); - - int threadingDepth = mSiteSettings.getThreadingLevels(); - if (ArrayUtils.contains(mThreadingPreference.getEntryValues(), String.valueOf(threadingDepth))) { - mThreadingPreference.setValue(String.valueOf(threadingDepth)); - } else { - mThreadingPreference.setValue(null); - } - switch (threadingDepth) { - case 0: - case 1: - mThreadingPreference.setSummary("None"); - break; - default: - mThreadingPreference.setSummary(String.format("%d levels", threadingDepth)); - break; - } - mThreadingPreference.refreshAdapter(); - - int pagingSize = mSiteSettings.getPagingCount(); - if (ArrayUtils.contains(mPagingPreference.getEntryValues(), String.valueOf(pagingSize))) { - mPagingPreference.setValue(String.valueOf(pagingSize)); - } else { - mPagingPreference.setValue(null); - } - switch (pagingSize) { - case 0: - mPagingPreference.setSummary("None"); - break; - case 1: - mPagingPreference.setSummary("1 comment per page"); - break; - default: - mPagingPreference.setSummary(String.format("%d comments per page", pagingSize)); - break; - } - mPagingPreference.refreshAdapter(); - - int sortOrder = mSiteSettings.getCommentSorting(); - String sortOrderString = String.valueOf(sortOrder); - if (!ArrayUtils.contains(mSortByPreference.getEntryValues(), sortOrderString)) { - sortOrderString = String.valueOf(sortOrder = SiteSettingsInterface.ASCENDING_SORT); - } - mSortByPreference.setValue(sortOrderString); - if (sortOrder == SiteSettingsInterface.ASCENDING_SORT) { - mSortByPreference.setSummary("Oldest first"); - } else { - mSortByPreference.setSummary("Newest first"); - } - mSortByPreference.refreshAdapter(); +// mModerationHoldPreference.setValue(mSiteSettings.getModerationKeys().toString()); +// mBlacklistPreference.setValue(mSiteSettings.getBlacklistKeys().toString()); } private void setCategories() { @@ -574,6 +537,12 @@ private void setReceivePingbacks(boolean newValue) { if (mReceivePingbacksNested.isChecked() != newValue) mReceivePingbacksNested.setChecked(newValue); } + private void setDetailListPreferenceValue(DetailListPreference pref, String value, String summary) { + pref.setValue(value); + pref.setSummary(summary); + pref.refreshAdapter(); + } + /** * 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. @@ -609,20 +578,45 @@ private void changeLanguageValue(String newValue) { } } - /** - * Updates the privacy preference summary. - */ - private void changePrivacyValue(int newValue) { - if (mPrivacyPreference == null) return; - - if (TextUtils.isEmpty(mPrivacyPreference.getSummary()) || - newValue != Integer.valueOf(mPrivacyPreference.getValue())) { - mPrivacyPreference.setValue(String.valueOf(newValue)); - mPrivacyPreference.setSummary(mSiteSettings.getPrivacyForDisplay()); - mPrivacyPreference.refreshAdapter(); + private String getPrivacySummary(int privacy) { + switch (privacy) { + 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 ""; } } + private String getCloseAfterSummary(int period) { + if (period == 0) getString(R.string.never); + return getResources().getQuantityString(R.plurals.days_quantity, period, period); + } + + private String getSortOrderSummary(int order) { + switch (order) { + case SiteSettingsInterface.ASCENDING_SORT: + return getString(R.string.oldest_first); + case SiteSettingsInterface.DESCENDING_SORT: + return getString(R.string.newest_first); + default: + return getString(R.string.unknown); + } + } + + private String getThreadingSummary(int levels) { + if (levels <= 1) getString(R.string.none); + return String.format(getString(R.string.levels), levels); + } + + private String getPagingSummary(int count) { + if (count == 0) return getString(R.string.none); + return getResources().getQuantityString(R.plurals.paging_quantity, count, count); + } + /** * Generates display strings for given language codes. Used as entries in language preference. */ diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java index 111cc8955c08..81457680a11c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsInterface.java @@ -172,19 +172,6 @@ public int getPrivacy() { return mSettings.privacy; } - public String getPrivacyForDisplay() { - switch (mSettings.privacy) { - case -1: - return mActivity.getString(R.string.privacy_private); - case 0: - return mActivity.getString(R.string.privacy_hidden); - case 1: - return mActivity.getString(R.string.privacy_public); - default: - return ""; - } - } - public String getLanguageCode() { return mSettings.language; } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 6b67de9b1578..4e8b7fc43e1e 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -72,6 +72,8 @@ Language Disconnect Undo + Never + Unknown Today @@ -546,6 +548,8 @@ in \"Upgrade\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the moderation queue. You can enter partial words, so \"press\" will match \"WordPress.\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. You can enter partial words, so \"press\" will match \"WordPress.\" + Oldest first + Newest first No comments Known users\' comments @@ -562,7 +566,7 @@ Automatically approve everyone\'s comments. - Never + @string/never One day One week One month @@ -574,8 +578,8 @@ 30 - Oldest first - Newest first + @string/oldest_first + @string/newest_first 0 @@ -605,6 +609,15 @@ 100 200 + + 1 day + %d days + + + 1 comment per page + %d comments per page + + levels Open source licenses diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 427a7aaf7012..d390af5a04af 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -203,6 +203,7 @@ android:title="@string/site_settings_close_after_title" android:entries="@array/site_settings_close_after_entries" android:entryValues="@array/site_settings_close_after_values" + android:defaultValue="0" app:longClickHint="@string/site_close_after_hint" /> - - Date: Mon, 9 Nov 2015 19:58:31 -0800 Subject: [PATCH 144/250] Saving moderation and blacklist key changes remotely --- .../android/ui/prefs/DotComSiteSettings.java | 22 ++- .../android/ui/prefs/LearnMorePreference.java | 11 +- .../ui/prefs/SiteSettingsFragment.java | 142 +++++++++++++++--- WordPress/src/main/res/layout/list_editor.xml | 40 +++++ WordPress/src/main/res/values/strings.xml | 2 +- 5 files changed, 181 insertions(+), 36 deletions(-) create mode 100644 WordPress/src/main/res/layout/list_editor.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index 64f10ddd3dfd..2b54b83f2571 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -262,12 +262,22 @@ public Map serializeDotComParams() { if (mSettings.commentAutoApprovalKnownUsers != mRemoteSettings.commentAutoApprovalKnownUsers) { params.put(WHITELIST_KNOWN_USERS_KEY, String.valueOf(mSettings.commentAutoApprovalKnownUsers)); } -// if (mSettings.holdForModeration != null && !mSettings.holdForModeration.equals(mRemoteSettings.holdForModeration)) { -// params.put(MODERATION_KEYS_KEY, String.valueOf(mSettings.holdForModeration)); -// } -// if (mSettings.blacklist != null && !mSettings.blacklist.equals(mRemoteSettings.blacklist)) { -// params.put(BLACKLIST_KEYS_KEY, String.valueOf(mSettings.blacklist)); -// } + if (mSettings.holdForModeration != null && !mSettings.holdForModeration.equals(mRemoteSettings.holdForModeration)) { + StringBuilder builder = new StringBuilder(); + for (String key : mSettings.holdForModeration) { + builder.append(key); + builder.append("\n"); + } + params.put(MODERATION_KEYS_KEY, builder.substring(0, builder.length() - 1)); + } + if (mSettings.blacklist != null && !mSettings.blacklist.equals(mRemoteSettings.blacklist)) { + StringBuilder builder = new StringBuilder(); + for (String key : mSettings.blacklist) { + builder.append(key); + builder.append("\n"); + } + params.put(BLACKLIST_KEYS_KEY, builder.substring(0, builder.length() - 1)); + } return params; } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java index 95a03b226783..24534a856581 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java @@ -41,23 +41,22 @@ public void onClick(View v) { if (mDialog != null) return; Context context = getContext(); - Dialog dialog = mDialog = new Dialog(context); - dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - dialog.setOnDismissListener(this); - dialog.setContentView(R.layout.learn_more_pref_screen); + mDialog = new Dialog(context); + mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + mDialog.setOnDismissListener(this); + mDialog.setContentView(R.layout.learn_more_pref_screen); WebView webView = new WebView(context); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView webView, String url) { super.onPageFinished(webView, url); - if (mDialog != null) { mDialog.setContentView(webView); } } }); webView.loadUrl(WP_SUPPORT_URL); - dialog.show(); + mDialog.show(); } @Override 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 7c21afcb3074..e70b0d4c8688 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,12 +1,15 @@ package org.wordpress.android.ui.prefs; +import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.graphics.Typeface; import android.os.Bundle; +import android.os.Handler; import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.PreferenceCategory; @@ -21,7 +24,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; @@ -29,6 +36,7 @@ import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; +import org.wordpress.android.util.AniUtils; import org.wordpress.android.util.CoreEvents; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; @@ -36,6 +44,7 @@ import org.wordpress.android.util.WPActivityUtils; import org.wordpress.android.widgets.TypefaceCache; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -49,6 +58,7 @@ public class SiteSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener, AdapterView.OnItemLongClickListener, + Dialog.OnDismissListener, SiteSettingsInterface.SiteSettingsListener { private static final String ADDRESS_FORMAT_REGEX = "^(https?://(w{3})?|www\\.)"; @@ -58,6 +68,7 @@ public class SiteSettingsFragment extends PreferenceFragment private Blog mBlog; private SiteSettingsInterface mSiteSettings; + private View mFabView; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; @@ -112,9 +123,24 @@ public void onCreate(Bundle savedInstanceState) { public void onResume() { super.onResume(); + // TODO: no! mSiteSettings.init(true); } + private void showFab() { + // redisplay hidden fab after a short delay + long delayMs = getResources().getInteger(R.integer.fab_animation_delay); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (isAdded() + && (mFabView.getVisibility() != View.VISIBLE || mFabView.getTranslationY() != 0)) { + AniUtils.showFab(mFabView, true); + } + } + }, delayMs); + } + @Override public void onDestroy() { super.onDestroy(); @@ -181,37 +207,106 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } + private List mEditingList; + @Override public boolean onPreferenceClick(Preference preference) { if (preference == mRelatedPostsPreference) { showRelatedPostsDialog(); return true; + } else if (preference == mMultipleLinksPreference) { + return true; + } else if (preference == mModerationHoldPreference) { + showListEditorDialog(R.string.site_settings_moderation_hold_title, + R.string.hold_for_moderation_description, + mSiteSettings.getModerationKeys()); + mEditingList = mSiteSettings.getModerationKeys(); + showFab(); + return true; + } else if (preference == mBlacklistPreference) { + showListEditorDialog(R.string.site_settings_blacklist_title, + R.string.blacklist_description, + mSiteSettings.getBlacklistKeys()); + mEditingList = mSiteSettings.getBlacklistKeys(); + showFab(); + return true; } return false; } - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { super.onPreferenceTreeClick(preferenceScreen, preference); - // If the user has clicked on a preference screen, set up the screen + // Add Action Bar to sub-screens if (preference instanceof PreferenceScreen) { - Dialog prefDialog = ((PreferenceScreen) preference).getDialog(); - if (prefDialog != null) { + Dialog dialog = ((PreferenceScreen) preference).getDialog(); + if (dialog != null) { String title = String.valueOf(preference.getTitle()); - WPActivityUtils.addToolbarToDialog(this, prefDialog, title); + WPActivityUtils.addToolbarToDialog(this, dialog, title); } - } else if (preference == mMultipleLinksPreference) { - } else if (preference == mModerationHoldPreference) { - // TODO: open custom dialog to edit keys - } else if (preference == mBlacklistPreference) { - // TODO: open custom dialog to edit keys } return false; } + + private void showListEditorDialog(int titleRes, int footerRes, List items) { + Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); + dialog.setOnDismissListener(this); + dialog.setContentView(getListEditorView(items, getString(footerRes))); + dialog.show(); + WPActivityUtils.addToolbarToDialog(this, dialog, getString(titleRes)); + } + + private void setEditorListEntries(ListView list, List items) { + if (list == null || items == null) return; + list.setAdapter(new ArrayAdapter<>(getActivity(), + android.R.layout.simple_list_item_1, + items)); + } + + private View getListEditorView(List items, String footerText) { + View view = View.inflate(getActivity(), R.layout.list_editor, null); + ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); + + final ListView list = (ListView) view.findViewById(android.R.id.list); + setEditorListEntries(list, items); + mFabView = view.findViewById(R.id.fab_button); + mFabView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = + new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + final EditText input = new EditText(getActivity()); + input.setPadding(16, 16, 16, 16); + input.setLayoutParams(params); + input.setHint("Enter a word or phrase"); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String entry = input.getText().toString(); + if (!mEditingList.contains(entry)) { + mEditingList.add(entry); + setEditorListEntries(list, mEditingList); + } + } + }); + builder.setNegativeButton(R.string.cancel, null); + AlertDialog alertDialog = builder.create(); + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + alertDialog.setView(input); + alertDialog.show(); + } + }); + + return view; + } + @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; @@ -278,10 +373,8 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setUserAccountRequired((Boolean) newValue); return true; } else if (preference == mWhitelistPreference) { -// mSiteSettings.setUseCommentWhitelist((Boolean) newValue); return true; } else if (preference == mMultipleLinksPreference) { -// mSiteSettings.setMultipleLinks((Boolean) newValue ? 1 : 0); return true; } else if (preference == mModerationHoldPreference) { return true; @@ -300,15 +393,15 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mCategoryPreference) { mSiteSettings.setDefaultCategory(Integer.parseInt(newValue.toString())); - mCategoryPreference.setValue(newValue.toString()); - mCategoryPreference.setSummary(mSiteSettings.getDefaultCategoryForDisplay()); - mCategoryPreference.refreshAdapter(); + setDetailListPreferenceValue(mCategoryPreference, + newValue.toString(), + mSiteSettings.getDefaultCategoryForDisplay()); return true; } else if (preference == mFormatPreference) { mSiteSettings.setDefaultFormat(newValue.toString()); - mFormatPreference.setValue(newValue.toString()); - mFormatPreference.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); - mFormatPreference.refreshAdapter(); + setDetailListPreferenceValue(mFormatPreference, + newValue.toString(), + mSiteSettings.getDefaultPostFormatDisplay()); return true; } @@ -337,6 +430,12 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l return false; } + @Override + public void onDismiss(DialogInterface dialog) { + mFabView = null; + mEditingList = null; + } + @Override public void onSettingsUpdated(Exception error) { if (error != null) { @@ -466,9 +565,6 @@ private void setPreferencesFromSiteSettings() { mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); mPagingPreference.setValue(String.valueOf(mSiteSettings.getPagingCount())); -// mWhitelistPreference.setChecked(mSiteSettings.getUseCommentWhitelist()); -// mModerationHoldPreference.setValue(mSiteSettings.getModerationKeys().toString()); -// mBlacklistPreference.setValue(mSiteSettings.getBlacklistKeys().toString()); } private void setCategories() { @@ -609,7 +705,7 @@ private String getSortOrderSummary(int order) { private String getThreadingSummary(int levels) { if (levels <= 1) getString(R.string.none); - return String.format(getString(R.string.levels), levels); + return String.format(getString(R.string.levels_quantity), levels); } private String getPagingSummary(int count) { diff --git a/WordPress/src/main/res/layout/list_editor.xml b/WordPress/src/main/res/layout/list_editor.xml new file mode 100644 index 000000000000..e46e35d40ddf --- /dev/null +++ b/WordPress/src/main/res/layout/list_editor.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 4e8b7fc43e1e..934b1d55fc14 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -617,7 +617,7 @@ 1 comment per page %d comments per page - levels + %d levels Open source licenses From 7743211ff5fed50337d8b89c5dfa3938cb7e9161 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 9 Nov 2015 20:04:55 -0800 Subject: [PATCH 145/250] Shortening variable names for preferences --- .../ui/prefs/SiteSettingsFragment.java | 375 +++++++++--------- 1 file changed, 187 insertions(+), 188 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 e70b0d4c8688..11899da5eb0e 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,33 +70,33 @@ public class SiteSettingsFragment extends PreferenceFragment private SiteSettingsInterface mSiteSettings; private View mFabView; - private EditTextPreference mTitlePreference; - private EditTextPreference mTaglinePreference; - private EditTextPreference mAddressPreference; - private DetailListPreference mLanguagePreference; - private DetailListPreference mPrivacyPreference; - private EditTextPreference mUsernamePreference; - private EditTextPreference mPasswordPreference; - private WPSwitchPreference mLocationPreference; - private DetailListPreference mCategoryPreference; - private DetailListPreference mFormatPreference; - private Preference mRelatedPostsPreference; + private EditTextPreference mTitlePref; + private EditTextPreference mTaglinePref; + private EditTextPreference mAddressPref; + private DetailListPreference mLanguagePref; + private DetailListPreference mPrivacyPref; + private EditTextPreference mUsernamePref; + private EditTextPreference mPasswordPref; + private WPSwitchPreference mLocationPref; + private DetailListPreference mCategoryPref; + private DetailListPreference mFormatPref; + private Preference mRelatedPostsPref; private WPSwitchPreference mAllowCommentsNested; - private WPSwitchPreference mAllowComments; + private WPSwitchPreference mAllowCommentsPref; private WPSwitchPreference mSendPingbacksNested; - private WPSwitchPreference mSendPingbacks; + private WPSwitchPreference mSendPingbacksPref; private WPSwitchPreference mReceivePingbacksNested; - private WPSwitchPreference mReceivePingbacks; + private WPSwitchPreference mReceivePingbacksPref; private WPSwitchPreference mIdentityRequiredPreference; - private WPSwitchPreference mUserAccountRequiredPreference; - private DetailListPreference mCloseAfterPreference; - private DetailListPreference mSortByPreference; - private DetailListPreference mThreadingPreference; - private DetailListPreference mPagingPreference; - private DetailListPreference mWhitelistPreference; - private WPPreference mMultipleLinksPreference; - private WPPreference mModerationHoldPreference; - private WPPreference mBlacklistPreference; + private WPSwitchPreference mUserAccountRequiredPref; + private DetailListPreference mCloseAfterPref; + private DetailListPreference mSortByPref; + private DetailListPreference mThreadingPref; + private DetailListPreference mPagingPref; + private DetailListPreference mWhitelistPref; + private WPPreference mMultipleLinksPref; + private WPPreference mModerationHoldPref; + private WPPreference mBlacklistPref; @Override public void onCreate(Bundle savedInstanceState) { @@ -211,19 +211,19 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { @Override public boolean onPreferenceClick(Preference preference) { - if (preference == mRelatedPostsPreference) { + if (preference == mRelatedPostsPref) { showRelatedPostsDialog(); return true; - } else if (preference == mMultipleLinksPreference) { + } else if (preference == mMultipleLinksPref) { return true; - } else if (preference == mModerationHoldPreference) { + } else if (preference == mModerationHoldPref) { showListEditorDialog(R.string.site_settings_moderation_hold_title, R.string.hold_for_moderation_description, mSiteSettings.getModerationKeys()); mEditingList = mSiteSettings.getModerationKeys(); showFab(); return true; - } else if (preference == mBlacklistPreference) { + } else if (preference == mBlacklistPref) { showListEditorDialog(R.string.site_settings_blacklist_title, R.string.blacklist_description, mSiteSettings.getBlacklistKeys()); @@ -251,155 +251,99 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen return false; } - - private void showListEditorDialog(int titleRes, int footerRes, List items) { - Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); - dialog.setOnDismissListener(this); - dialog.setContentView(getListEditorView(items, getString(footerRes))); - dialog.show(); - WPActivityUtils.addToolbarToDialog(this, dialog, getString(titleRes)); - } - - private void setEditorListEntries(ListView list, List items) { - if (list == null || items == null) return; - list.setAdapter(new ArrayAdapter<>(getActivity(), - android.R.layout.simple_list_item_1, - items)); - } - - private View getListEditorView(List items, String footerText) { - View view = View.inflate(getActivity(), R.layout.list_editor, null); - ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); - - final ListView list = (ListView) view.findViewById(android.R.id.list); - setEditorListEntries(list, items); - mFabView = view.findViewById(R.id.fab_button); - mFabView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - AlertDialog.Builder builder = - new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); - LinearLayout.LayoutParams params = - new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - final EditText input = new EditText(getActivity()); - input.setPadding(16, 16, 16, 16); - input.setLayoutParams(params); - input.setHint("Enter a word or phrase"); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String entry = input.getText().toString(); - if (!mEditingList.contains(entry)) { - mEditingList.add(entry); - setEditorListEntries(list, mEditingList); - } - } - }); - builder.setNegativeButton(R.string.cancel, null); - AlertDialog alertDialog = builder.create(); - alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - alertDialog.setView(input); - alertDialog.show(); - } - }); - - return view; - } - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; - if (preference == mTitlePreference) { + if (preference == mTitlePref) { mSiteSettings.setTitle(newValue.toString()); - changeEditTextPreferenceValue(mTitlePreference, mSiteSettings.getTitle()); + changeEditTextPreferenceValue(mTitlePref, mSiteSettings.getTitle()); return true; - } else if (preference == mTaglinePreference) { + } else if (preference == mTaglinePref) { mSiteSettings.setTagline(newValue.toString()); - changeEditTextPreferenceValue(mTaglinePreference, mSiteSettings.getTagline()); + changeEditTextPreferenceValue(mTaglinePref, mSiteSettings.getTagline()); return true; - } else if (preference == mAddressPreference) { + } else if (preference == mAddressPref) { mSiteSettings.setAddress(newValue.toString()); - changeEditTextPreferenceValue(mAddressPreference, mSiteSettings.getAddress()); + changeEditTextPreferenceValue(mAddressPref, mSiteSettings.getAddress()); return true; - } else if (preference == mLanguagePreference) { + } else if (preference == mLanguagePref) { mSiteSettings.setLanguageCode(newValue.toString()); changeLanguageValue(mSiteSettings.getLanguageCode()); return true; - } else if (preference == mPrivacyPreference) { + } else if (preference == mPrivacyPref) { mSiteSettings.setPrivacy(Integer.valueOf(newValue.toString())); - setDetailListPreferenceValue(mPrivacyPreference, + setDetailListPreferenceValue(mPrivacyPref, String.valueOf(mSiteSettings.getPrivacy()), getPrivacySummary(mSiteSettings.getPrivacy())); return true; - } else if (preference == mAllowComments || preference == mAllowCommentsNested) { + } else if (preference == mAllowCommentsPref || preference == mAllowCommentsNested) { setAllowComments((Boolean) newValue); return true; - } else if (preference == mSendPingbacks || preference == mSendPingbacksNested) { + } else if (preference == mSendPingbacksPref || preference == mSendPingbacksNested) { setSendPingbacks((Boolean) newValue); return true; - } else if (preference == mReceivePingbacks || preference == mReceivePingbacksNested) { + } else if (preference == mReceivePingbacksPref || preference == mReceivePingbacksNested) { setReceivePingbacks((Boolean) newValue); return true; - } else if (preference == mCloseAfterPreference) { + } else if (preference == mCloseAfterPref) { mSiteSettings.setCloseAfter(Integer.parseInt(newValue.toString())); - setDetailListPreferenceValue(mCloseAfterPreference, + setDetailListPreferenceValue(mCloseAfterPref, newValue.toString(), getCloseAfterSummary(mSiteSettings.getCloseAfter())); return true; - } else if (preference == mSortByPreference) { + } else if (preference == mSortByPref) { mSiteSettings.setCommentSorting(Integer.parseInt(newValue.toString())); - setDetailListPreferenceValue(mSortByPreference, + setDetailListPreferenceValue(mSortByPref, newValue.toString(), getSortOrderSummary(mSiteSettings.getCommentSorting())); return true; - } else if (preference == mThreadingPreference) { + } else if (preference == mThreadingPref) { mSiteSettings.setThreadingLevels(Integer.parseInt(newValue.toString())); - setDetailListPreferenceValue(mThreadingPreference, + setDetailListPreferenceValue(mThreadingPref, newValue.toString(), getThreadingSummary(mSiteSettings.getThreadingLevels())); return true; - } else if (preference == mPagingPreference) { + } else if (preference == mPagingPref) { mSiteSettings.setPagingCount(Integer.parseInt(newValue.toString())); - setDetailListPreferenceValue(mPagingPreference, + setDetailListPreferenceValue(mPagingPref, newValue.toString(), getPagingSummary(mSiteSettings.getPagingCount())); return true; } else if (preference == mIdentityRequiredPreference) { mSiteSettings.setIdentityRequired((Boolean) newValue); return true; - } else if (preference == mUserAccountRequiredPreference) { + } else if (preference == mUserAccountRequiredPref) { mSiteSettings.setUserAccountRequired((Boolean) newValue); return true; - } else if (preference == mWhitelistPreference) { + } else if (preference == mWhitelistPref) { return true; - } else if (preference == mMultipleLinksPreference) { + } else if (preference == mMultipleLinksPref) { return true; - } else if (preference == mModerationHoldPreference) { + } else if (preference == mModerationHoldPref) { return true; - } else if (preference == mBlacklistPreference) { + } else if (preference == mBlacklistPref) { return true; - } else if (preference == mUsernamePreference) { + } else if (preference == mUsernamePref) { mSiteSettings.setUsername(newValue.toString()); - changeEditTextPreferenceValue(mUsernamePreference, mSiteSettings.getUsername()); + changeEditTextPreferenceValue(mUsernamePref, mSiteSettings.getUsername()); return true; - } else if (preference == mPasswordPreference) { + } else if (preference == mPasswordPref) { mSiteSettings.setPassword(newValue.toString()); - changeEditTextPreferenceValue(mPasswordPreference, mSiteSettings.getPassword()); + changeEditTextPreferenceValue(mPasswordPref, mSiteSettings.getPassword()); return true; - } else if (preference == mLocationPreference) { + } else if (preference == mLocationPref) { mSiteSettings.setLocation((Boolean) newValue); return true; - } else if (preference == mCategoryPreference) { + } else if (preference == mCategoryPref) { mSiteSettings.setDefaultCategory(Integer.parseInt(newValue.toString())); - setDetailListPreferenceValue(mCategoryPreference, + setDetailListPreferenceValue(mCategoryPref, newValue.toString(), mSiteSettings.getDefaultCategoryForDisplay()); return true; - } else if (preference == mFormatPreference) { + } else if (preference == mFormatPref) { mSiteSettings.setDefaultFormat(newValue.toString()); - setDetailListPreferenceValue(mFormatPreference, + setDetailListPreferenceValue(mFormatPref, newValue.toString(), mSiteSettings.getDefaultPostFormatDisplay()); return true; @@ -466,47 +410,47 @@ public void onCredentialsValidated(Exception error) { public void allowEditing(boolean allow) { // Address won't be editable until the app supports domain name changes - if (mAddressPreference != null) mAddressPreference.setEnabled(false); - if (mTitlePreference != null) mTitlePreference.setEnabled(allow); - if (mTaglinePreference != null) mTaglinePreference.setEnabled(allow); - if (mPrivacyPreference != null) mPrivacyPreference.setEnabled(allow); - if (mLanguagePreference != null) mLanguagePreference.setEnabled(allow); + if (mAddressPref != null) mAddressPref.setEnabled(false); + if (mTitlePref != null) mTitlePref.setEnabled(allow); + if (mTaglinePref != null) mTaglinePref.setEnabled(allow); + if (mPrivacyPref != null) mPrivacyPref.setEnabled(allow); + if (mLanguagePref != null) mLanguagePref.setEnabled(allow); } /** * Helper method to retrieve {@link Preference} references and initialize any data. */ private void initPreferences() { - mTitlePreference = (EditTextPreference) getPref(R.string.pref_key_site_title); - mTaglinePreference = (EditTextPreference) getPref(R.string.pref_key_site_tagline); - mAddressPreference = (EditTextPreference) getPref(R.string.pref_key_site_address); - mPrivacyPreference = (DetailListPreference) getPref(R.string.pref_key_site_visibility); - mLanguagePreference = (DetailListPreference) getPref(R.string.pref_key_site_language); - mUsernamePreference = (EditTextPreference) getPref(R.string.pref_key_site_username); - mPasswordPreference = (EditTextPreference) getPref(R.string.pref_key_site_password); - mLocationPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_location); - mCategoryPreference = (DetailListPreference) getPref(R.string.pref_key_site_category); - mFormatPreference = (DetailListPreference) getPref(R.string.pref_key_site_format); - mAllowComments = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments); + mTitlePref = (EditTextPreference) getPref(R.string.pref_key_site_title); + mTaglinePref = (EditTextPreference) getPref(R.string.pref_key_site_tagline); + mAddressPref = (EditTextPreference) getPref(R.string.pref_key_site_address); + mPrivacyPref = (DetailListPreference) getPref(R.string.pref_key_site_visibility); + mLanguagePref = (DetailListPreference) getPref(R.string.pref_key_site_language); + mUsernamePref = (EditTextPreference) getPref(R.string.pref_key_site_username); + mPasswordPref = (EditTextPreference) getPref(R.string.pref_key_site_password); + mLocationPref = (WPSwitchPreference) getPref(R.string.pref_key_site_location); + mCategoryPref = (DetailListPreference) getPref(R.string.pref_key_site_category); + mFormatPref = (DetailListPreference) getPref(R.string.pref_key_site_format); + mAllowCommentsPref = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments); mAllowCommentsNested = (WPSwitchPreference) getPref(R.string.pref_key_site_allow_comments_nested); - mSendPingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks); + mSendPingbacksPref = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks); mSendPingbacksNested = (WPSwitchPreference) getPref(R.string.pref_key_site_send_pingbacks_nested); - mReceivePingbacks = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks); + mReceivePingbacksPref = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks); mReceivePingbacksNested = (WPSwitchPreference) getPref(R.string.pref_key_site_receive_pingbacks_nested); mIdentityRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_identity_required); - mUserAccountRequiredPreference = (WPSwitchPreference) getPref(R.string.pref_key_site_user_account_required); - mCloseAfterPreference = (DetailListPreference) getPref(R.string.pref_key_site_close_after); - mSortByPreference = (DetailListPreference) getPref(R.string.pref_key_site_sort_by); - mThreadingPreference = (DetailListPreference) getPref(R.string.pref_key_site_threading); - mPagingPreference = (DetailListPreference) getPref(R.string.pref_key_site_paging); - mWhitelistPreference = (DetailListPreference) getPref(R.string.pref_key_site_whitelist); - mMultipleLinksPreference = (WPPreference) getPref(R.string.pref_key_site_multiple_links); - mModerationHoldPreference = (WPPreference) getPref(R.string.pref_key_site_moderation_hold); - mBlacklistPreference = (WPPreference) getPref(R.string.pref_key_site_blacklist); - mRelatedPostsPreference = findPreference(getString(R.string.pref_key_site_related_posts)); - mRelatedPostsPreference.setOnPreferenceClickListener(this); - mModerationHoldPreference.setOnPreferenceClickListener(this); - mBlacklistPreference.setOnPreferenceClickListener(this); + mUserAccountRequiredPref = (WPSwitchPreference) getPref(R.string.pref_key_site_user_account_required); + mCloseAfterPref = (DetailListPreference) getPref(R.string.pref_key_site_close_after); + mSortByPref = (DetailListPreference) getPref(R.string.pref_key_site_sort_by); + mThreadingPref = (DetailListPreference) getPref(R.string.pref_key_site_threading); + mPagingPref = (DetailListPreference) getPref(R.string.pref_key_site_paging); + mWhitelistPref = (DetailListPreference) getPref(R.string.pref_key_site_whitelist); + mMultipleLinksPref = (WPPreference) getPref(R.string.pref_key_site_multiple_links); + mModerationHoldPref = (WPPreference) getPref(R.string.pref_key_site_moderation_hold); + mBlacklistPref = (WPPreference) getPref(R.string.pref_key_site_blacklist); + mRelatedPostsPref = findPreference(getString(R.string.pref_key_site_related_posts)); + mRelatedPostsPref.setOnPreferenceClickListener(this); + mModerationHoldPref.setOnPreferenceClickListener(this); + mBlacklistPref.setOnPreferenceClickListener(this); // .com sites hide the Account category, self-hosted sites hide the Related Posts preference if (mBlog.isDotcomFlag()) { @@ -535,13 +479,13 @@ private void showRelatedPostsDialog() { } private void setPreferencesFromSiteSettings() { - mLocationPreference.setChecked(mSiteSettings.getLocation()); - changeEditTextPreferenceValue(mTitlePreference, mSiteSettings.getTitle()); - changeEditTextPreferenceValue(mTaglinePreference, mSiteSettings.getTagline()); - changeEditTextPreferenceValue(mAddressPreference, mSiteSettings.getAddress()); - changeEditTextPreferenceValue(mUsernamePreference, mSiteSettings.getUsername()); - changeEditTextPreferenceValue(mPasswordPreference, mSiteSettings.getPassword()); - setDetailListPreferenceValue(mPrivacyPreference, + mLocationPref.setChecked(mSiteSettings.getLocation()); + changeEditTextPreferenceValue(mTitlePref, mSiteSettings.getTitle()); + changeEditTextPreferenceValue(mTaglinePref, mSiteSettings.getTagline()); + changeEditTextPreferenceValue(mAddressPref, mSiteSettings.getAddress()); + changeEditTextPreferenceValue(mUsernamePref, mSiteSettings.getUsername()); + changeEditTextPreferenceValue(mPasswordPref, mSiteSettings.getPassword()); + setDetailListPreferenceValue(mPrivacyPref, String.valueOf(mSiteSettings.getPrivacy()), getPrivacySummary(mSiteSettings.getPrivacy())); setCategories(); @@ -549,29 +493,29 @@ private void setPreferencesFromSiteSettings() { setAllowComments(mSiteSettings.getAllowComments()); setSendPingbacks(mSiteSettings.getSendPingbacks()); setReceivePingbacks(mSiteSettings.getReceivePingbacks()); - setDetailListPreferenceValue(mCloseAfterPreference, + setDetailListPreferenceValue(mCloseAfterPref, String.valueOf(mSiteSettings.getCloseAfter()), getCloseAfterSummary(mSiteSettings.getCloseAfter())); - setDetailListPreferenceValue(mSortByPreference, + setDetailListPreferenceValue(mSortByPref, String.valueOf(mSiteSettings.getCommentSorting()), getSortOrderSummary(mSiteSettings.getCommentSorting())); - setDetailListPreferenceValue(mThreadingPreference, + setDetailListPreferenceValue(mThreadingPref, String.valueOf(mSiteSettings.getThreadingLevels()), getThreadingSummary(mSiteSettings.getThreadingLevels())); - setDetailListPreferenceValue(mPagingPreference, + setDetailListPreferenceValue(mPagingPref, String.valueOf(mSiteSettings.getPagingCount()), getPagingSummary(mSiteSettings.getPagingCount())); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); - mUserAccountRequiredPreference.setChecked(mSiteSettings.getUserAccountRequired()); - mThreadingPreference.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); - mPagingPreference.setValue(String.valueOf(mSiteSettings.getPagingCount())); + mUserAccountRequiredPref.setChecked(mSiteSettings.getUserAccountRequired()); + mThreadingPref.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); + mPagingPref.setValue(String.valueOf(mSiteSettings.getPagingCount())); } private void setCategories() { // Ignore if there are no changes - if (mSiteSettings.isSameCategoryList(mCategoryPreference.getEntryValues())) { - mCategoryPreference.setValue(String.valueOf(mSiteSettings.getDefaultCategory())); - mCategoryPreference.setSummary(mSiteSettings.getDefaultCategoryForDisplay()); + if (mSiteSettings.isSameCategoryList(mCategoryPref.getEntryValues())) { + mCategoryPref.setValue(String.valueOf(mSiteSettings.getDefaultCategory())); + mCategoryPref.setSummary(mSiteSettings.getDefaultCategoryForDisplay()); return; } @@ -584,17 +528,17 @@ private void setCategories() { values[i++] = String.valueOf(key); } - mCategoryPreference.setEntries(entries); - mCategoryPreference.setEntryValues(values); - mCategoryPreference.setValue(String.valueOf(mSiteSettings.getDefaultCategory())); - mCategoryPreference.setSummary(mSiteSettings.getDefaultCategoryForDisplay()); + mCategoryPref.setEntries(entries); + mCategoryPref.setEntryValues(values); + mCategoryPref.setValue(String.valueOf(mSiteSettings.getDefaultCategory())); + mCategoryPref.setSummary(mSiteSettings.getDefaultCategoryForDisplay()); } private void setPostFormats() { // Ignore if there are no changes - if (mSiteSettings.isSameFormatList(mFormatPreference.getEntryValues())) { - mFormatPreference.setValue(String.valueOf(mSiteSettings.getDefaultFormat())); - mFormatPreference.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); + if (mSiteSettings.isSameFormatList(mFormatPref.getEntryValues())) { + mFormatPref.setValue(String.valueOf(mSiteSettings.getDefaultFormat())); + mFormatPref.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); return; } @@ -609,27 +553,27 @@ private void setPostFormats() { values[i] = formatKeys[i]; } - mFormatPreference.setEntries(entries); - mFormatPreference.setEntryValues(values); - mFormatPreference.setValue(String.valueOf(mSiteSettings.getDefaultFormat())); - mFormatPreference.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); + mFormatPref.setEntries(entries); + mFormatPref.setEntryValues(values); + mFormatPref.setValue(String.valueOf(mSiteSettings.getDefaultFormat())); + mFormatPref.setSummary(mSiteSettings.getDefaultPostFormatDisplay()); } private void setAllowComments(boolean newValue) { mSiteSettings.setAllowComments(newValue); - mAllowComments.setChecked(newValue); + mAllowCommentsPref.setChecked(newValue); mAllowCommentsNested.setChecked(newValue); } private void setSendPingbacks(boolean newValue) { mSiteSettings.setSendPingbacks(newValue); - if (mSendPingbacks.isChecked() != newValue) mSendPingbacks.setChecked(newValue); + if (mSendPingbacksPref.isChecked() != newValue) mSendPingbacksPref.setChecked(newValue); if (mSendPingbacksNested.isChecked() != newValue) mSendPingbacksNested.setChecked(newValue); } private void setReceivePingbacks(boolean newValue) { mSiteSettings.setReceivePingbacks(newValue); - if (mReceivePingbacks.isChecked() != newValue) mReceivePingbacks.setChecked(newValue); + if (mReceivePingbacksPref.isChecked() != newValue) mReceivePingbacksPref.setChecked(newValue); if (mReceivePingbacksNested.isChecked() != newValue) mReceivePingbacksNested.setChecked(newValue); } @@ -658,19 +602,19 @@ private void changeEditTextPreferenceValue(EditTextPreference pref, String newVa * Detail strings for the dialog are generated in the selected language. */ private void changeLanguageValue(String newValue) { - if (mLanguagePreference == null || newValue == null) return; + if (mLanguagePref == null || newValue == null) return; - if (TextUtils.isEmpty(mLanguagePreference.getSummary()) || - !newValue.equals(mLanguagePreference.getValue())) { - mLanguagePreference.setValue(newValue); + if (TextUtils.isEmpty(mLanguagePref.getSummary()) || + !newValue.equals(mLanguagePref.getValue())) { + mLanguagePref.setValue(newValue); String summary = getLanguageString(newValue, languageLocale(newValue)); - mLanguagePreference.setSummary(summary); + mLanguagePref.setSummary(summary); // update details to display in selected locale - CharSequence[] languageCodes = mLanguagePreference.getEntryValues(); - mLanguagePreference.setEntries(createLanguageDisplayStrings(languageCodes)); - mLanguagePreference.setDetails(createLanguageDetailDisplayStrings(languageCodes, newValue)); - mLanguagePreference.refreshAdapter(); + CharSequence[] languageCodes = mLanguagePref.getEntryValues(); + mLanguagePref.setEntries(createLanguageDisplayStrings(languageCodes)); + mLanguagePref.setDetails(createLanguageDetailDisplayStrings(languageCodes, newValue)); + mLanguagePref.refreshAdapter(); } } @@ -713,6 +657,61 @@ private String getPagingSummary(int count) { return getResources().getQuantityString(R.plurals.paging_quantity, count, count); } + private void showListEditorDialog(int titleRes, int footerRes, List items) { + Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); + dialog.setOnDismissListener(this); + dialog.setContentView(getListEditorView(items, getString(footerRes))); + dialog.show(); + WPActivityUtils.addToolbarToDialog(this, dialog, getString(titleRes)); + } + + private void setEditorListEntries(ListView list, List items) { + if (list == null || items == null) return; + list.setAdapter(new ArrayAdapter<>(getActivity(), + android.R.layout.simple_list_item_1, + items)); + } + + private View getListEditorView(List items, String footerText) { + View view = View.inflate(getActivity(), R.layout.list_editor, null); + ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); + + final ListView list = (ListView) view.findViewById(android.R.id.list); + setEditorListEntries(list, items); + mFabView = view.findViewById(R.id.fab_button); + mFabView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = + new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + final EditText input = new EditText(getActivity()); + input.setPadding(16, 16, 16, 16); + input.setLayoutParams(params); + input.setHint("Enter a word or phrase"); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String entry = input.getText().toString(); + if (!mEditingList.contains(entry)) { + mEditingList.add(entry); + setEditorListEntries(list, mEditingList); + } + } + }); + builder.setNegativeButton(R.string.cancel, null); + AlertDialog alertDialog = builder.create(); + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + alertDialog.setView(input); + alertDialog.show(); + } + }); + + return view; + } + /** * Generates display strings for given language codes. Used as entries in language preference. */ From b09e329bffad4a517c383032d8b626d843002fc5 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 9 Nov 2015 20:09:37 -0800 Subject: [PATCH 146/250] Fixing summary string issue --- .../android/ui/prefs/SiteSettingsFragment.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 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 11899da5eb0e..a6497b1b24b1 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 @@ -94,9 +94,9 @@ public class SiteSettingsFragment extends PreferenceFragment private DetailListPreference mThreadingPref; private DetailListPreference mPagingPref; private DetailListPreference mWhitelistPref; - private WPPreference mMultipleLinksPref; - private WPPreference mModerationHoldPref; - private WPPreference mBlacklistPref; + private Preference mMultipleLinksPref; + private Preference mModerationHoldPref; + private Preference mBlacklistPref; @Override public void onCreate(Bundle savedInstanceState) { @@ -444,9 +444,9 @@ private void initPreferences() { mThreadingPref = (DetailListPreference) getPref(R.string.pref_key_site_threading); mPagingPref = (DetailListPreference) getPref(R.string.pref_key_site_paging); mWhitelistPref = (DetailListPreference) getPref(R.string.pref_key_site_whitelist); - mMultipleLinksPref = (WPPreference) getPref(R.string.pref_key_site_multiple_links); - mModerationHoldPref = (WPPreference) getPref(R.string.pref_key_site_moderation_hold); - mBlacklistPref = (WPPreference) getPref(R.string.pref_key_site_blacklist); + mMultipleLinksPref = getPref(R.string.pref_key_site_multiple_links); + mModerationHoldPref = getPref(R.string.pref_key_site_moderation_hold); + mBlacklistPref = getPref(R.string.pref_key_site_blacklist); mRelatedPostsPref = findPreference(getString(R.string.pref_key_site_related_posts)); mRelatedPostsPref.setOnPreferenceClickListener(this); mModerationHoldPref.setOnPreferenceClickListener(this); @@ -632,7 +632,7 @@ private String getPrivacySummary(int privacy) { } private String getCloseAfterSummary(int period) { - if (period == 0) getString(R.string.never); + if (period == 0) return getString(R.string.never); return getResources().getQuantityString(R.plurals.days_quantity, period, period); } @@ -648,7 +648,7 @@ private String getSortOrderSummary(int order) { } private String getThreadingSummary(int levels) { - if (levels <= 1) getString(R.string.none); + if (levels <= 1) return getString(R.string.none); return String.format(getString(R.string.levels_quantity), levels); } From a49d7e4dd8df85d1731dbc0808f0440c8ce73e6f Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 9 Nov 2015 21:21:10 -0800 Subject: [PATCH 147/250] Adding picker dialog to edit max links allowed in comments --- .../android/ui/prefs/DotComSiteSettings.java | 24 ++++++++-- .../ui/prefs/SiteSettingsFragment.java | 48 +++++++++++++++++-- .../main/res/layout/number_picker_dialog.xml | 19 ++++++++ WordPress/src/main/res/values/integers.xml | 3 ++ WordPress/src/main/res/values/strings.xml | 8 +++- 5 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 WordPress/src/main/res/layout/number_picker_dialog.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index 2b54b83f2571..b2d487df28f1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -238,7 +238,12 @@ public Map serializeDotComParams() { params.put(COMMENT_MODERATION_KEY, String.valueOf(mSettings.commentApprovalRequired)); } if (mSettings.closeCommentAfter != mRemoteSettings.closeCommentAfter) { - params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); + if (mSettings.closeCommentAfter <= 0) { + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(false)); + } else { + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(true)); + params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); + } } if (mSettings.sortCommentsBy != mRemoteSettings.sortCommentsBy) { if (mSettings.sortCommentsBy == ASCENDING_SORT) { @@ -248,10 +253,20 @@ public Map serializeDotComParams() { } } if (mSettings.threadingLevels != mRemoteSettings.threadingLevels) { - params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); + if (mSettings.threadingLevels <= 1) { + params.put(THREAD_COMMENTS_KEY, String.valueOf(false)); + } else { + params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); + } } if (mSettings.commentsPerPage != mRemoteSettings.commentsPerPage) { - params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); + if (mSettings.commentsPerPage <= 0) { + params.put(PAGE_COMMENTS_KEY, String.valueOf(false)); + } else{ + params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); + } } if (mSettings.commentsRequireIdentity != mRemoteSettings.commentsRequireIdentity) { params.put(REQUIRE_IDENTITY_KEY, String.valueOf(mSettings.commentsRequireIdentity)); @@ -262,6 +277,9 @@ public Map serializeDotComParams() { if (mSettings.commentAutoApprovalKnownUsers != mRemoteSettings.commentAutoApprovalKnownUsers) { params.put(WHITELIST_KNOWN_USERS_KEY, String.valueOf(mSettings.commentAutoApprovalKnownUsers)); } + if (mSettings.maxLinks != mRemoteSettings.maxLinks) { + params.put(MAX_LINKS_KEY, String.valueOf(mSettings.maxLinks)); + } if (mSettings.holdForModeration != null && !mSettings.holdForModeration.equals(mRemoteSettings.holdForModeration)) { StringBuilder builder = new StringBuilder(); for (String key : mSettings.holdForModeration) { 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 a6497b1b24b1..710609de3fa6 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 @@ -31,6 +31,7 @@ import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; +import android.widget.NumberPicker; import android.widget.TextView; import org.wordpress.android.R; @@ -69,6 +70,7 @@ public class SiteSettingsFragment extends PreferenceFragment private Blog mBlog; private SiteSettingsInterface mSiteSettings; private View mFabView; + private List mEditingList; private EditTextPreference mTitlePref; private EditTextPreference mTaglinePref; @@ -207,7 +209,23 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } - private List mEditingList; + private void showMultipleLinksDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + View view = View.inflate(getActivity(), R.layout.number_picker_dialog, null); + final NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.number_picker); + numberPicker.setMaxValue(100); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (mSiteSettings.getMultipleLinks() != numberPicker.getValue()) { + onPreferenceChange(mMultipleLinksPref, numberPicker.getValue()); + } + } + }); + builder.setNegativeButton(R.string.cancel, null); + builder.setView(view); + builder.create().show(); + } @Override public boolean onPreferenceClick(Preference preference) { @@ -215,6 +233,7 @@ public boolean onPreferenceClick(Preference preference) { showRelatedPostsDialog(); return true; } else if (preference == mMultipleLinksPref) { + showMultipleLinksDialog(); return true; } else if (preference == mModerationHoldPref) { showListEditorDialog(R.string.site_settings_moderation_hold_title, @@ -317,12 +336,13 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setUserAccountRequired((Boolean) newValue); return true; } else if (preference == mWhitelistPref) { + setDetailListPreferenceValue(mWhitelistPref, + newValue.toString(), + getWhitelistSummary(Integer.parseInt(newValue.toString()))); return true; } else if (preference == mMultipleLinksPref) { - return true; - } else if (preference == mModerationHoldPref) { - return true; - } else if (preference == mBlacklistPref) { + mSiteSettings.setMultipleLinks(Integer.parseInt(newValue.toString())); + mMultipleLinksPref.setSummary("Require approval for more than " + mSiteSettings.getMultipleLinks() + " links"); return true; } else if (preference == mUsernamePref) { mSiteSettings.setUsername(newValue.toString()); @@ -449,6 +469,7 @@ private void initPreferences() { mBlacklistPref = getPref(R.string.pref_key_site_blacklist); mRelatedPostsPref = findPreference(getString(R.string.pref_key_site_related_posts)); mRelatedPostsPref.setOnPreferenceClickListener(this); + mMultipleLinksPref.setOnPreferenceClickListener(this); mModerationHoldPref.setOnPreferenceClickListener(this); mBlacklistPref.setOnPreferenceClickListener(this); @@ -505,6 +526,10 @@ private void setPreferencesFromSiteSettings() { setDetailListPreferenceValue(mPagingPref, String.valueOf(mSiteSettings.getPagingCount()), getPagingSummary(mSiteSettings.getPagingCount())); + int approval = mSiteSettings.getManualApproval() ? + mSiteSettings.getUseCommentWhitelist() ? 0 + : -1 : 1; + setDetailListPreferenceValue(mWhitelistPref, String.valueOf(approval), getWhitelistSummary(approval)); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); mUserAccountRequiredPref.setChecked(mSiteSettings.getUserAccountRequired()); mThreadingPref.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); @@ -657,6 +682,19 @@ private String getPagingSummary(int count) { return getResources().getQuantityString(R.plurals.paging_quantity, count, count); } + private String getWhitelistSummary(int value) { + switch (value) { + case -1: + return getString(R.string.whitelist_summary_no_users); + case 0: + return getString(R.string.whitelist_summary_known_users); + case 1: + return getString(R.string.whitelist_summary_all_users); + default: + return ""; + } + } + private void showListEditorDialog(int titleRes, int footerRes, List items) { Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); dialog.setOnDismissListener(this); diff --git a/WordPress/src/main/res/layout/number_picker_dialog.xml b/WordPress/src/main/res/layout/number_picker_dialog.xml new file mode 100644 index 000000000000..e3b1c775e52e --- /dev/null +++ b/WordPress/src/main/res/layout/number_picker_dialog.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/WordPress/src/main/res/values/integers.xml b/WordPress/src/main/res/values/integers.xml index e1f57247f4ac..11f6f7a0fee0 100644 --- a/WordPress/src/main/res/values/integers.xml +++ b/WordPress/src/main/res/values/integers.xml @@ -16,4 +16,7 @@ 300 + + 100 + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 934b1d55fc14..ad3a29f73232 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -548,6 +548,7 @@ in \"Upgrade\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the moderation queue. You can enter partial words, so \"press\" will match \"WordPress.\" When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. You can enter partial words, so \"press\" will match \"WordPress.\" + Require approval for comments that include more than this number of links. Oldest first Newest first @@ -586,19 +587,21 @@ 1 + @string/none Two levels Three levels Four levels Five levels + 1 2 3 4 5 - None + @string/none 50 comments per page 100 comments per page 200 comments per page @@ -618,6 +621,9 @@ %d comments per page %d levels + Comments from all users + Comments from known users + @string/none Open source licenses From 70b4522c7e69a847c7c298b06a35a404aa17a1db Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 13:56:56 -0800 Subject: [PATCH 148/250] Fixing auto-approval settings --- .../ui/prefs/SiteSettingsFragment.java | 24 +++++++++-- WordPress/src/main/res/values/strings.xml | 43 ++++++++----------- 2 files changed, 40 insertions(+), 27 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 710609de3fa6..bc9e0008e1b9 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 @@ -336,9 +336,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mSiteSettings.setUserAccountRequired((Boolean) newValue); return true; } else if (preference == mWhitelistPref) { - setDetailListPreferenceValue(mWhitelistPref, - newValue.toString(), - getWhitelistSummary(Integer.parseInt(newValue.toString()))); + updateWhitelistSettings(Integer.parseInt(newValue.toString())); return true; } else if (preference == mMultipleLinksPref) { mSiteSettings.setMultipleLinks(Integer.parseInt(newValue.toString())); @@ -695,6 +693,26 @@ private String getWhitelistSummary(int value) { } } + private void updateWhitelistSettings(int val) { + switch (val) { + case -1: + mSiteSettings.setManualApproval(true); + mSiteSettings.setUseCommentWhitelist(false); + break; + case 0: + mSiteSettings.setManualApproval(true); + mSiteSettings.setUseCommentWhitelist(true); + break; + case 1: + mSiteSettings.setManualApproval(false); + mSiteSettings.setUseCommentWhitelist(false); + break; + } + setDetailListPreferenceValue(mWhitelistPref, + String.valueOf(val), + getWhitelistSummary(val)); + } + private void showListEditorDialog(int titleRes, int footerRes, List items) { Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); dialog.setOnDismissListener(this); diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 932d7a17f60d..690fed08e138 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -625,6 +625,25 @@ Comments from all users Comments from known users @string/none + Privacy + Public + Hidden + Private + + @string/privacy_public + @string/privacy_hidden + @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 + 0 + -1 + Open source licenses @@ -928,30 +947,6 @@ Video - - Privacy - Public - Hidden - Private - - @string/privacy_public - @string/privacy_hidden - @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 - 0 - -1 - - en_US From f448f99ccc375c87aa66055db98d9508176042e0 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 14:35:18 -0800 Subject: [PATCH 149/250] Fixing title and hints for discussion preference screen --- .../android/ui/prefs/LearnMorePreference.java | 2 +- .../ui/prefs/SiteSettingsFragment.java | 92 ++++++++----------- .../src/main/res/layout/learn_more_pref.xml | 4 +- WordPress/src/main/res/xml/site_settings.xml | 4 +- 4 files changed, 43 insertions(+), 59 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java index 24534a856581..c95b180e5b98 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/LearnMorePreference.java @@ -31,7 +31,7 @@ protected View onCreateView(@NonNull ViewGroup parent) { super.onCreateView(parent); View view = View.inflate(getContext(), R.layout.learn_more_pref, null); - view.findViewById(R.id.learnMoreButton).setOnClickListener(this); + view.findViewById(R.id.learn_more_button).setOnClickListener(this); return view; } 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 bc9e0008e1b9..1dcc97015d92 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 @@ -9,7 +9,6 @@ import android.content.res.Resources; import android.graphics.Typeface; import android.os.Bundle; -import android.os.Handler; import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.PreferenceCategory; @@ -37,7 +36,6 @@ import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; -import org.wordpress.android.util.AniUtils; import org.wordpress.android.util.CoreEvents; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; @@ -129,20 +127,6 @@ public void onResume() { mSiteSettings.init(true); } - private void showFab() { - // redisplay hidden fab after a short delay - long delayMs = getResources().getInteger(R.integer.fab_animation_delay); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (isAdded() - && (mFabView.getVisibility() != View.VISIBLE || mFabView.getTranslationY() != 0)) { - AniUtils.showFab(mFabView, true); - } - } - }, delayMs); - } - @Override public void onDestroy() { super.onDestroy(); @@ -151,6 +135,20 @@ public void onDestroy() { mSiteSettings.saveSettings(); } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case RELATED_POSTS_REQUEST_CODE: + if (data == null) return; + mSiteSettings.setShowRelatedPosts(data.getBooleanExtra(RelatedPostsDialog.SHOW_RELATED_POSTS_KEY, false)); + mSiteSettings.setShowRelatedPostHeader(data.getBooleanExtra(RelatedPostsDialog.SHOW_HEADER_KEY, false)); + mSiteSettings.setShowRelatedPostImages(data.getBooleanExtra(RelatedPostsDialog.SHOW_IMAGES_KEY, false)); + break; + } + + super.onActivityResult(requestCode, resultCode, data); + } + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -195,38 +193,6 @@ public void onChildViewRemoved(View parent, View child) { return view; } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case RELATED_POSTS_REQUEST_CODE: - if (data == null) return; - mSiteSettings.setShowRelatedPosts(data.getBooleanExtra(RelatedPostsDialog.SHOW_RELATED_POSTS_KEY, false)); - mSiteSettings.setShowRelatedPostHeader(data.getBooleanExtra(RelatedPostsDialog.SHOW_HEADER_KEY, false)); - mSiteSettings.setShowRelatedPostImages(data.getBooleanExtra(RelatedPostsDialog.SHOW_IMAGES_KEY, false)); - break; - } - - super.onActivityResult(requestCode, resultCode, data); - } - - private void showMultipleLinksDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); - View view = View.inflate(getActivity(), R.layout.number_picker_dialog, null); - final NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.number_picker); - numberPicker.setMaxValue(100); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (mSiteSettings.getMultipleLinks() != numberPicker.getValue()) { - onPreferenceChange(mMultipleLinksPref, numberPicker.getValue()); - } - } - }); - builder.setNegativeButton(R.string.cancel, null); - builder.setView(view); - builder.create().show(); - } - @Override public boolean onPreferenceClick(Preference preference) { if (preference == mRelatedPostsPref) { @@ -240,14 +206,12 @@ public boolean onPreferenceClick(Preference preference) { R.string.hold_for_moderation_description, mSiteSettings.getModerationKeys()); mEditingList = mSiteSettings.getModerationKeys(); - showFab(); return true; } else if (preference == mBlacklistPref) { showListEditorDialog(R.string.site_settings_blacklist_title, R.string.blacklist_description, mSiteSettings.getBlacklistKeys()); mEditingList = mSiteSettings.getBlacklistKeys(); - showFab(); return true; } @@ -255,14 +219,16 @@ public boolean onPreferenceClick(Preference preference) { } @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - super.onPreferenceTreeClick(preferenceScreen, preference); + public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { + super.onPreferenceTreeClick(screen, preference); // Add Action Bar to sub-screens - if (preference instanceof PreferenceScreen) { + if (preference == findPreference(getString(R.string.pref_key_site_more_discussion))) { Dialog dialog = ((PreferenceScreen) preference).getDialog(); if (dialog != null) { - String title = String.valueOf(preference.getTitle()); + ListView prefList = (ListView) dialog.findViewById(android.R.id.list); + prefList.setOnItemLongClickListener(this); + String title = getString(R.string.site_settings_discussion_title); WPActivityUtils.addToolbarToDialog(this, dialog, title); } } @@ -497,6 +463,24 @@ private void showRelatedPostsDialog() { relatedPosts.show(getFragmentManager(), "related-posts"); } + private void showMultipleLinksDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + View view = View.inflate(getActivity(), R.layout.number_picker_dialog, null); + final NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.number_picker); + numberPicker.setMaxValue(100); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (mSiteSettings.getMultipleLinks() != numberPicker.getValue()) { + onPreferenceChange(mMultipleLinksPref, numberPicker.getValue()); + } + } + }); + builder.setNegativeButton(R.string.cancel, null); + builder.setView(view); + builder.create().show(); + } + private void setPreferencesFromSiteSettings() { mLocationPref.setChecked(mSiteSettings.getLocation()); changeEditTextPreferenceValue(mTitlePref, mSiteSettings.getTitle()); diff --git a/WordPress/src/main/res/layout/learn_more_pref.xml b/WordPress/src/main/res/layout/learn_more_pref.xml index 5c04a1f39b81..eb2b78bbcd50 100644 --- a/WordPress/src/main/res/layout/learn_more_pref.xml +++ b/WordPress/src/main/res/layout/learn_more_pref.xml @@ -14,7 +14,7 @@ android:paddingBottom="16dp"> From 6acbe7ae531f9c5f4b12c6959582a999eb63a781 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 14:44:01 -0800 Subject: [PATCH 150/250] Updating font style on WPPreference summary text --- .../android/ui/prefs/WPPreference.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPPreference.java index c8333ab6ea37..befad0ffd87b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPPreference.java @@ -37,18 +37,23 @@ public WPPreference(Context context, AttributeSet attrs) { protected void onBindView(@NonNull View view) { super.onBindView(view); + Resources res = getContext().getResources(); + Typeface typeface = TypefaceCache.getTypeface(getContext(), + TypefaceCache.FAMILY_OPEN_SANS, + Typeface.NORMAL, + TypefaceCache.VARIATION_NORMAL); TextView titleView = (TextView) view.findViewById(android.R.id.title); + TextView summaryView = (TextView) view.findViewById(android.R.id.summary); if (titleView != null) { - Resources res = getContext().getResources(); - Typeface typeface = TypefaceCache.getTypeface(getContext(), - TypefaceCache.FAMILY_OPEN_SANS, - Typeface.NORMAL, - TypefaceCache.VARIATION_NORMAL); - titleView.setTypeface(typeface); titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, res.getDimensionPixelSize(R.dimen.text_sz_large)); titleView.setTextColor(res.getColor(isEnabled() ? R.color.grey_dark : R.color.grey_lighten_10)); } + if (summaryView != null) { + summaryView.setTypeface(typeface); + summaryView.setTextSize(TypedValue.COMPLEX_UNIT_PX, res.getDimensionPixelSize(R.dimen.text_sz_medium)); + summaryView.setTextColor(res.getColor(isEnabled() ? R.color.grey_darken_10 : R.color.grey_lighten_10)); + } } @Override From 744b85b64f12ba081e0e773f34c99e7ae3ae0ff7 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 15:03:40 -0800 Subject: [PATCH 151/250] Formatting text in list editor dialog --- .../android/ui/prefs/SiteSettingsFragment.java | 15 ++++++--------- WordPress/src/main/res/layout/list_editor.xml | 8 +++++++- .../src/main/res/layout/wp_simple_list_item_1.xml | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 WordPress/src/main/res/layout/wp_simple_list_item_1.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 1dcc97015d92..0ae310aef5f3 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 @@ -67,7 +67,6 @@ public class SiteSettingsFragment extends PreferenceFragment private Blog mBlog; private SiteSettingsInterface mSiteSettings; - private View mFabView; private List mEditingList; private EditTextPreference mTitlePref; @@ -202,16 +201,16 @@ public boolean onPreferenceClick(Preference preference) { showMultipleLinksDialog(); return true; } else if (preference == mModerationHoldPref) { + mEditingList = mSiteSettings.getModerationKeys(); showListEditorDialog(R.string.site_settings_moderation_hold_title, R.string.hold_for_moderation_description, - mSiteSettings.getModerationKeys()); - mEditingList = mSiteSettings.getModerationKeys(); + mEditingList); return true; } else if (preference == mBlacklistPref) { + mEditingList = mSiteSettings.getBlacklistKeys(); showListEditorDialog(R.string.site_settings_blacklist_title, R.string.blacklist_description, - mSiteSettings.getBlacklistKeys()); - mEditingList = mSiteSettings.getBlacklistKeys(); + mEditingList); return true; } @@ -360,7 +359,6 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l @Override public void onDismiss(DialogInterface dialog) { - mFabView = null; mEditingList = null; } @@ -708,7 +706,7 @@ private void showListEditorDialog(int titleRes, int footerRes, List item private void setEditorListEntries(ListView list, List items) { if (list == null || items == null) return; list.setAdapter(new ArrayAdapter<>(getActivity(), - android.R.layout.simple_list_item_1, + R.layout.wp_simple_list_item_1, items)); } @@ -718,8 +716,7 @@ private View getListEditorView(List items, String footerText) { final ListView list = (ListView) view.findViewById(android.R.id.list); setEditorListEntries(list, items); - mFabView = view.findViewById(R.id.fab_button); - mFabView.setOnClickListener(new View.OnClickListener() { + view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = diff --git a/WordPress/src/main/res/layout/list_editor.xml b/WordPress/src/main/res/layout/list_editor.xml index e46e35d40ddf..a5b00c6a1d66 100644 --- a/WordPress/src/main/res/layout/list_editor.xml +++ b/WordPress/src/main/res/layout/list_editor.xml @@ -15,7 +15,13 @@ + android:layout_height="wrap_content" + android:paddingLeft="@dimen/margin_extra_large" + android:paddingStart="@dimen/margin_extra_large" + android:paddingRight="@dimen/margin_extra_large" + android:paddingEnd="@dimen/margin_extra_large" + android:paddingTop="@dimen/margin_extra_large" + android:textColor="@color/grey_darken_10" /> + + From ce1e7461f8df106c4e7e9508bdd77de974c86832 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 15:17:03 -0800 Subject: [PATCH 152/250] Adding padding to list editor entry dialog --- .../android/ui/prefs/SiteSettingsFragment.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 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 0ae310aef5f3..42cf350c13c6 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,7 +27,6 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; -import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.NumberPicker; @@ -41,6 +40,7 @@ import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.WPActivityUtils; +import org.wordpress.android.util.widgets.WPEditText; import org.wordpress.android.widgets.TypefaceCache; import java.util.List; @@ -721,12 +721,7 @@ private View getListEditorView(List items, String footerText) { public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); - LinearLayout.LayoutParams params = - new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - final EditText input = new EditText(getActivity()); - input.setPadding(16, 16, 16, 16); - input.setLayoutParams(params); + final EditText input = new WPEditText(getActivity()); input.setHint("Enter a word or phrase"); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override @@ -740,8 +735,8 @@ public void onClick(DialogInterface dialog, int which) { }); builder.setNegativeButton(R.string.cancel, null); AlertDialog alertDialog = builder.create(); + alertDialog.setView(input, 64, 64, 64, 0); alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - alertDialog.setView(input); alertDialog.show(); } }); From 1a65ffed6440998aa87de197acd277af716f433a Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 15:24:29 -0800 Subject: [PATCH 153/250] Not adding empty string to moderation and blacklist keys --- .../android/ui/prefs/DotComSiteSettings.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index b2d487df28f1..ab9d531b964b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -155,10 +155,14 @@ public void deserializeDotComRestResponse(Blog blog, JSONObject response) { mRemoteSettings.holdForModeration = new ArrayList<>(); mRemoteSettings.blacklist = new ArrayList<>(); - Collections.addAll(mRemoteSettings.holdForModeration, - settingsObject.optString(MODERATION_KEYS_KEY, "").split("\n")); - Collections.addAll(mRemoteSettings.blacklist, - settingsObject.optString(BLACKLIST_KEYS_KEY, "").split("\n")); + String modKeys = settingsObject.optString(MODERATION_KEYS_KEY, ""); + if (modKeys.length() > 0) { + Collections.addAll(mRemoteSettings.holdForModeration, modKeys.split("\n")); + } + String blacklistKeys = settingsObject.optString(BLACKLIST_KEYS_KEY, ""); + if (blacklistKeys.length() > 0) { + Collections.addAll(mRemoteSettings.blacklist, blacklistKeys.split("\n")); + } if (settingsObject.optBoolean(CLOSE_OLD_COMMENTS_KEY, false)) { mRemoteSettings.closeCommentAfter = settingsObject.optInt(CLOSE_OLD_COMMENTS_DAYS_KEY, 0); From 9f6e55724e1deb665a0f2a4670dc70e52300958d Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 15:36:53 -0800 Subject: [PATCH 154/250] Adding empty view for list editor screen --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 1 + WordPress/src/main/res/layout/list_editor.xml | 9 +++++++++ WordPress/src/main/res/values/strings.xml | 1 + 3 files changed, 11 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 42cf350c13c6..e75ad4c311c2 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 @@ -715,6 +715,7 @@ private View getListEditorView(List items, String footerText) { ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); final ListView list = (ListView) view.findViewById(android.R.id.list); + list.setEmptyView(view.findViewById(R.id.empty_view)); setEditorListEntries(list, items); view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { @Override diff --git a/WordPress/src/main/res/layout/list_editor.xml b/WordPress/src/main/res/layout/list_editor.xml index a5b00c6a1d66..00a107c6ad3e 100644 --- a/WordPress/src/main/res/layout/list_editor.xml +++ b/WordPress/src/main/res/layout/list_editor.xml @@ -7,6 +7,15 @@ android:layout_height="match_parent" android:orientation="vertical"> + + Require approval for comments that include more than this number of links. Oldest first Newest first + No items No comments Known users\' comments From 219d67d53b606b8e72b4451a59ed5e2fba462f6d Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 15:47:23 -0800 Subject: [PATCH 155/250] Setting initial summary for multiple links preference --- .../wordpress/android/ui/prefs/SiteSettingsFragment.java | 9 ++++++++- WordPress/src/main/res/values/strings.xml | 4 ++++ 2 files changed, 12 insertions(+), 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 e75ad4c311c2..83d5a79cbff8 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,10 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mMultipleLinksPref) { mSiteSettings.setMultipleLinks(Integer.parseInt(newValue.toString())); - mMultipleLinksPref.setSummary("Require approval for more than " + mSiteSettings.getMultipleLinks() + " links"); + mMultipleLinksPref.setSummary(getResources() + .getQuantityString(R.plurals.multiple_links_summary, + mSiteSettings.getMultipleLinks(), + mSiteSettings.getMultipleLinks())); return true; } else if (preference == mUsernamePref) { mSiteSettings.setUsername(newValue.toString()); @@ -510,6 +513,10 @@ private void setPreferencesFromSiteSettings() { mSiteSettings.getUseCommentWhitelist() ? 0 : -1 : 1; setDetailListPreferenceValue(mWhitelistPref, String.valueOf(approval), getWhitelistSummary(approval)); + mMultipleLinksPref.setSummary(getResources() + .getQuantityString(R.plurals.multiple_links_summary, + mSiteSettings.getMultipleLinks(), + mSiteSettings.getMultipleLinks())); mIdentityRequiredPreference.setChecked(mSiteSettings.getIdentityRequired()); mUserAccountRequiredPref.setChecked(mSiteSettings.getUserAccountRequired()); mThreadingPref.setValue(String.valueOf(mSiteSettings.getThreadingLevels())); diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 4503a4033c55..99492837542e 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -553,6 +553,10 @@ Oldest first Newest first No items + + Require approval for more than 1 link + Require approval for more than %d links + No comments Known users\' comments From 7b47db44f12f65ac9c864ecf5509e3676bb9ec5d Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 11 Nov 2015 20:18:48 -0800 Subject: [PATCH 156/250] Deserializing .org settings response using patched endpoint. --- .../android/ui/prefs/DotComSiteSettings.java | 14 +-- .../ui/prefs/SelfHostedSiteSettings.java | 113 +++++++++++++++--- 2 files changed, 101 insertions(+), 26 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java index ab9d531b964b..94fbc0cfea42 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DotComSiteSettings.java @@ -33,13 +33,6 @@ class DotComSiteSettings extends SiteSettingsInterface { public static final String ALLOW_COMMENTS_KEY = "default_comment_status"; public static final String SEND_PINGBACKS_KEY = "default_pingback_flag"; public static final String RECEIVE_PINGBACKS_KEY = "default_ping_status"; - public static final String COMMENT_MODERATION_KEY = "comment_moderation"; - public static final String REQUIRE_IDENTITY_KEY = "require_name_email"; - public static final String REQUIRE_USER_ACCOUNT_KEY = "comment_registration"; - public static final String WHITELIST_KNOWN_USERS_KEY = "comment_whitelist"; - public static final String MAX_LINKS_KEY = "comment_max_links"; - public static final String MODERATION_KEYS_KEY = "moderation_keys"; - public static final String BLACKLIST_KEYS_KEY = "blacklist_keys"; public static final String CLOSE_OLD_COMMENTS_KEY = "close_comments_for_old_posts"; public static final String CLOSE_OLD_COMMENTS_DAYS_KEY = "close_comments_days_old"; public static final String THREAD_COMMENTS_KEY = "thread_comments"; @@ -47,6 +40,13 @@ class DotComSiteSettings extends SiteSettingsInterface { public static final String PAGE_COMMENTS_KEY = "page_comments"; public static final String PAGE_COMMENT_COUNT_KEY = "comments_per_page"; public static final String COMMENT_SORT_ORDER_KEY = "comment_order"; + public static final String COMMENT_MODERATION_KEY = "comment_moderation"; + public static final String REQUIRE_IDENTITY_KEY = "require_name_email"; + public static final String REQUIRE_USER_ACCOUNT_KEY = "comment_registration"; + public static final String WHITELIST_KNOWN_USERS_KEY = "comment_whitelist"; + public static final String MAX_LINKS_KEY = "comment_max_links"; + public static final String MODERATION_KEYS_KEY = "moderation_keys"; + public static final String BLACKLIST_KEYS_KEY = "blacklist_keys"; // WP.com REST keys used to GET certain site settings public static final String GET_TITLE_KEY = "name"; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java index d92979e86cbf..a39a433662f7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java @@ -14,6 +14,8 @@ import org.xmlrpc.android.XMLRPCClientInterface; import org.xmlrpc.android.XMLRPCException; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -25,11 +27,34 @@ class SelfHostedSiteSettings extends SiteSettingsInterface { private static final String BLOG_USERNAME_KEY = "username"; private static final String BLOG_PASSWORD_KEY = "password"; private static final String BLOG_TAGLINE_KEY = "blog_tagline"; + public static final String PRIVACY_KEY = "blog_public"; + public static final String DEF_CATEGORY_KEY = "default_category"; + public static final String DEF_POST_FORMAT_KEY = "default_post_format"; + public static final String ALLOW_COMMENTS_KEY = "default_comment_status"; + public static final String SEND_PINGBACKS_KEY = "default_pingback_flag"; + public static final String RECEIVE_PINGBACKS_KEY = "default_ping_status"; + public static final String CLOSE_OLD_COMMENTS_KEY = "close_comments_for_old_posts"; + public static final String CLOSE_OLD_COMMENTS_DAYS_KEY = "close_comments_days_old"; + public static final String THREAD_COMMENTS_KEY = "thread_comments"; + public static final String THREAD_COMMENTS_DEPTH_KEY = "thread_comments_depth"; + public static final String PAGE_COMMENTS_KEY = "page_comments"; + public static final String PAGE_COMMENT_COUNT_KEY = "comments_per_page"; + public static final String COMMENT_SORT_ORDER_KEY = "comment_order"; + public static final String COMMENT_MODERATION_KEY = "comment_moderation"; + public static final String REQUIRE_IDENTITY_KEY = "require_name_email"; + public static final String REQUIRE_USER_ACCOUNT_KEY = "comment_registration"; + public static final String WHITELIST_KNOWN_USERS_KEY = "comment_whitelist"; + public static final String MAX_LINKS_KEY = "comment_max_links"; + public static final String MODERATION_KEYS_KEY = "moderation_keys"; + public static final String BLACKLIST_KEYS_KEY = "blacklist_keys"; private static final String BLOG_CATEGORY_ID_KEY = "categoryId"; private static final String BLOG_CATEGORY_PARENT_ID_KEY = "parentId"; private static final String BLOG_CATEGORY_DESCRIPTION_KEY = "categoryDescription"; private static final String BLOG_CATEGORY_NAME_KEY = "categoryName"; + private static final String OPTION_ALLOWED = "open"; + private static final String OPTION_DISALLOWED = "closed"; + SelfHostedSiteSettings(Activity host, Blog blog, SiteSettingsListener listener) { super(host, blog, listener); } @@ -49,25 +74,6 @@ public SiteSettingsInterface init(boolean fetch) { return this; } - public Map serializeSelfHostedParams() { - Map params = new HashMap<>(); - - if (mSettings.title != null && !mSettings.title.equals(mRemoteSettings.title)) { - params.put(BLOG_TITLE_KEY, mSettings.title); - } - if (mSettings.tagline != null && !mSettings.tagline.equals(mRemoteSettings.tagline)) { - params.put(BLOG_TAGLINE_KEY, mSettings.tagline); - } - if (mSettings.username != null && !mSettings.username.equals(mRemoteSettings.username)) { - params.put(BLOG_USERNAME_KEY, mSettings.username); - } - if (mSettings.password != null && !mSettings.password.equals(mRemoteSettings.password)) { - params.put(BLOG_PASSWORD_KEY, mSettings.password); - } - - return params; - } - @Override public void saveSettings() { super.saveSettings(); @@ -165,6 +171,25 @@ public void onFailure(long id, final Exception error) { } }; + private Map serializeSelfHostedParams() { + Map params = new HashMap<>(); + + if (mSettings.title != null && !mSettings.title.equals(mRemoteSettings.title)) { + params.put(BLOG_TITLE_KEY, mSettings.title); + } + if (mSettings.tagline != null && !mSettings.tagline.equals(mRemoteSettings.tagline)) { + params.put(BLOG_TAGLINE_KEY, mSettings.tagline); + } + if (mSettings.sendPingbacks != mRemoteSettings.sendPingbacks) { + params.put(SEND_PINGBACKS_KEY, mSettings.sendPingbacks ? OPTION_ALLOWED : OPTION_DISALLOWED); + } + if (mSettings.receivePingbacks != mRemoteSettings.receivePingbacks) { + params.put(RECEIVE_PINGBACKS_KEY, mSettings.receivePingbacks ? OPTION_ALLOWED : OPTION_DISALLOWED); + } + + return params; + } + /** * Sets values from a self-hosted XML-RPC response object. */ @@ -176,6 +201,56 @@ private void deserializeOptionsResponse(SiteSettingsModel model, Map response) { model.address = getNestedMapValue(response, BLOG_URL_KEY); model.title = getNestedMapValue(response, BLOG_TITLE_KEY); model.tagline = getNestedMapValue(response, BLOG_TAGLINE_KEY); + model.privacy = Integer.valueOf(getNestedMapValue(response, PRIVACY_KEY)); + model.defaultCategory = Integer.valueOf(getNestedMapValue(response, DEF_CATEGORY_KEY)); + model.defaultPostFormat = getNestedMapValue(response, DEF_POST_FORMAT_KEY); + model.allowComments = OPTION_ALLOWED.equals(getNestedMapValue(response, ALLOW_COMMENTS_KEY)); + model.sendPingbacks = Boolean.valueOf(getNestedMapValue(response, SEND_PINGBACKS_KEY)); + model.receivePingbacks = OPTION_ALLOWED.equals(getNestedMapValue(response, RECEIVE_PINGBACKS_KEY)); + String approvalRequired = getNestedMapValue(response, COMMENT_MODERATION_KEY); + String identityRequired = getNestedMapValue(response, REQUIRE_IDENTITY_KEY); + String accountRequired = getNestedMapValue(response, REQUIRE_USER_ACCOUNT_KEY); + String knownUsers = getNestedMapValue(response, WHITELIST_KNOWN_USERS_KEY); + model.commentApprovalRequired = !TextUtils.isEmpty(approvalRequired) && Integer.valueOf(approvalRequired) > 0; + model.commentsRequireIdentity = !TextUtils.isEmpty(identityRequired) && Integer.valueOf(identityRequired) > 0; + model.commentsRequireUserAccount = !TextUtils.isEmpty(accountRequired) && Integer.valueOf(accountRequired) > 0; + model.commentAutoApprovalKnownUsers = !TextUtils.isEmpty(knownUsers) && Integer.valueOf(knownUsers) > 0; + model.maxLinks = Integer.valueOf(getNestedMapValue(response, MAX_LINKS_KEY)); + mRemoteSettings.holdForModeration = new ArrayList<>(); + mRemoteSettings.blacklist = new ArrayList<>(); + + String modKeys = getNestedMapValue(response, MODERATION_KEYS_KEY); + if (modKeys.length() > 0) { + Collections.addAll(mRemoteSettings.holdForModeration, modKeys.split("\n")); + } + String blacklistKeys = getNestedMapValue(response, BLACKLIST_KEYS_KEY); + if (blacklistKeys.length() > 0) { + Collections.addAll(mRemoteSettings.blacklist, blacklistKeys.split("\n")); + } + + if (Boolean.valueOf(getNestedMapValue(response, CLOSE_OLD_COMMENTS_KEY))) { + mRemoteSettings.closeCommentAfter = Integer.valueOf(getNestedMapValue(response, CLOSE_OLD_COMMENTS_DAYS_KEY)); + } else { + mRemoteSettings.closeCommentAfter = 0; + } + + if (Boolean.valueOf(getNestedMapValue(response, THREAD_COMMENTS_KEY))) { + mRemoteSettings.threadingLevels = Integer.valueOf(getNestedMapValue(response, THREAD_COMMENTS_DEPTH_KEY)); + } else { + mRemoteSettings.threadingLevels = 0; + } + + if (Boolean.valueOf(getNestedMapValue(response, PAGE_COMMENTS_KEY))) { + mRemoteSettings.commentsPerPage = Integer.valueOf(getNestedMapValue(response, PAGE_COMMENT_COUNT_KEY)); + } else { + mRemoteSettings.commentsPerPage = 0; + } + + if (getNestedMapValue(response, COMMENT_SORT_ORDER_KEY).equals("asc")) { + mRemoteSettings.sortCommentsBy = ASCENDING_SORT; + } else { + mRemoteSettings.sortCommentsBy = DESCENDING_SORT; + } } private void deserializeCategoriesResponse(SiteSettingsModel model, Object[] response) { From 726293fb639d5a1c5c88efb29305800491cc548c Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 12:59:39 -0800 Subject: [PATCH 157/250] Adding editable preferences back to self-hosted sites --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 3 --- 1 file changed, 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 83d5a79cbff8..f51c252d78d2 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 @@ -443,11 +443,8 @@ private void initPreferences() { removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_account); removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_remove_site); } else { - removePreference(R.string.pref_key_site_general, R.string.pref_key_site_visibility); removePreference(R.string.pref_key_site_general, R.string.pref_key_site_language); removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_related_posts); - removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_category); - removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_format); removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_start_over); removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_delete_site); } From 1c4ea659ed539afd124efd07738092116302b8cf Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 13:00:47 -0800 Subject: [PATCH 158/250] Saving changed settings on self-hosted sites remotely --- .../ui/prefs/SelfHostedSiteSettings.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java index a39a433662f7..596816429730 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java @@ -180,12 +180,86 @@ private Map serializeSelfHostedParams() { if (mSettings.tagline != null && !mSettings.tagline.equals(mRemoteSettings.tagline)) { params.put(BLOG_TAGLINE_KEY, mSettings.tagline); } + if (mSettings.privacy != mRemoteSettings.privacy) { + params.put(PRIVACY_KEY, String.valueOf(mSettings.privacy)); + } + if (mSettings.defaultCategory != mRemoteSettings.defaultCategory) { + params.put(DEF_CATEGORY_KEY, String.valueOf(mSettings.defaultCategory)); + } + if (mSettings.defaultPostFormat != null && !mSettings.defaultPostFormat.equals(mRemoteSettings.defaultPostFormat)) { + params.put(DEF_POST_FORMAT_KEY, mSettings.defaultPostFormat); + } + if (mSettings.allowComments != mRemoteSettings.allowComments) { + params.put(ALLOW_COMMENTS_KEY, String.valueOf(mSettings.allowComments)); + } if (mSettings.sendPingbacks != mRemoteSettings.sendPingbacks) { params.put(SEND_PINGBACKS_KEY, mSettings.sendPingbacks ? OPTION_ALLOWED : OPTION_DISALLOWED); } if (mSettings.receivePingbacks != mRemoteSettings.receivePingbacks) { params.put(RECEIVE_PINGBACKS_KEY, mSettings.receivePingbacks ? OPTION_ALLOWED : OPTION_DISALLOWED); } + if (mSettings.commentApprovalRequired != mRemoteSettings.commentApprovalRequired) { + params.put(COMMENT_MODERATION_KEY, String.valueOf(mSettings.commentApprovalRequired)); + } + if (mSettings.closeCommentAfter != mRemoteSettings.closeCommentAfter) { + if (mSettings.closeCommentAfter <= 0) { + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(false)); + } else { + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(true)); + params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); + } + } + if (mSettings.sortCommentsBy != mRemoteSettings.sortCommentsBy) { + if (mSettings.sortCommentsBy == ASCENDING_SORT) { + params.put(COMMENT_SORT_ORDER_KEY, "asc"); + } else if (mSettings.sortCommentsBy == DESCENDING_SORT) { + params.put(COMMENT_SORT_ORDER_KEY, "desc"); + } + } + if (mSettings.threadingLevels != mRemoteSettings.threadingLevels) { + if (mSettings.threadingLevels <= 1) { + params.put(THREAD_COMMENTS_KEY, String.valueOf(false)); + } else { + params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); + } + } + if (mSettings.commentsPerPage != mRemoteSettings.commentsPerPage) { + if (mSettings.commentsPerPage <= 0) { + params.put(PAGE_COMMENTS_KEY, String.valueOf(false)); + } else{ + params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); + } + } + if (mSettings.commentsRequireIdentity != mRemoteSettings.commentsRequireIdentity) { + params.put(REQUIRE_IDENTITY_KEY, String.valueOf(mSettings.commentsRequireIdentity)); + } + if (mSettings.commentsRequireUserAccount != mRemoteSettings.commentsRequireUserAccount) { + params.put(REQUIRE_USER_ACCOUNT_KEY, String.valueOf(mSettings.commentsRequireUserAccount)); + } + if (mSettings.commentAutoApprovalKnownUsers != mRemoteSettings.commentAutoApprovalKnownUsers) { + params.put(WHITELIST_KNOWN_USERS_KEY, String.valueOf(mSettings.commentAutoApprovalKnownUsers)); + } + if (mSettings.maxLinks != mRemoteSettings.maxLinks) { + params.put(MAX_LINKS_KEY, String.valueOf(mSettings.maxLinks)); + } + if (mSettings.holdForModeration != null && !mSettings.holdForModeration.equals(mRemoteSettings.holdForModeration)) { + StringBuilder builder = new StringBuilder(); + for (String key : mSettings.holdForModeration) { + builder.append(key); + builder.append("\n"); + } + params.put(MODERATION_KEYS_KEY, builder.substring(0, builder.length() - 1)); + } + if (mSettings.blacklist != null && !mSettings.blacklist.equals(mRemoteSettings.blacklist)) { + StringBuilder builder = new StringBuilder(); + for (String key : mSettings.blacklist) { + builder.append(key); + builder.append("\n"); + } + params.put(BLACKLIST_KEYS_KEY, builder.substring(0, builder.length() - 1)); + } return params; } From c83844c24a473ff357a48f215b849345b9ac1598 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 14:14:57 -0800 Subject: [PATCH 159/250] Fixing lint errors --- WordPress/src/main/res/layout/list_editor.xml | 1 - WordPress/src/main/res/layout/wp_simple_list_item_1.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/WordPress/src/main/res/layout/list_editor.xml b/WordPress/src/main/res/layout/list_editor.xml index 00a107c6ad3e..51b3630f501b 100644 --- a/WordPress/src/main/res/layout/list_editor.xml +++ b/WordPress/src/main/res/layout/list_editor.xml @@ -26,7 +26,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="@dimen/margin_extra_large" - android:paddingStart="@dimen/margin_extra_large" android:paddingRight="@dimen/margin_extra_large" android:paddingEnd="@dimen/margin_extra_large" android:paddingTop="@dimen/margin_extra_large" diff --git a/WordPress/src/main/res/layout/wp_simple_list_item_1.xml b/WordPress/src/main/res/layout/wp_simple_list_item_1.xml index 5964cdd7f602..07eb1f6c676e 100644 --- a/WordPress/src/main/res/layout/wp_simple_list_item_1.xml +++ b/WordPress/src/main/res/layout/wp_simple_list_item_1.xml @@ -8,7 +8,6 @@ android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingRight="?android:attr/listPreferredItemPaddingRight" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:minHeight="?android:attr/listPreferredItemHeightSmall" /> From 8ebfb26e4b54b927a9954d8db62ada9e501aed62 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 15:18:55 -0800 Subject: [PATCH 160/250] Formatting number picker dialog --- .../wordpress/android/ui/WPNumberPicker.java | 49 +++++++++++++++++++ .../ui/prefs/SiteSettingsFragment.java | 14 +++++- .../main/res/layout/number_picker_dialog.xml | 14 ++++-- WordPress/src/main/res/values/strings.xml | 2 +- 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/WPNumberPicker.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WPNumberPicker.java b/WordPress/src/main/java/org/wordpress/android/ui/WPNumberPicker.java new file mode 100644 index 000000000000..bfc75a997306 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/WPNumberPicker.java @@ -0,0 +1,49 @@ +package org.wordpress.android.ui; + +import android.content.Context; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.View; +import android.widget.NumberPicker; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.widgets.TypefaceCache; + +public class WPNumberPicker extends NumberPicker { + public WPNumberPicker(Context context, AttributeSet attrs) { + super(context, attrs); + setWrapSelectorWheel(false); + } + + @Override + public void addView(View child) { + super.addView(child); + updateView(child); + } + + @Override + public void addView(View child, int index, + android.view.ViewGroup.LayoutParams params) { + super.addView(child, index, params); + updateView(child); + } + + @Override + public void addView(View child, android.view.ViewGroup.LayoutParams params) { + super.addView(child, params); + updateView(child); + } + + private void updateView(View view) { + if (view instanceof TextView) { + Typeface type = TypefaceCache.getTypeface(getContext(), + TypefaceCache.FAMILY_OPEN_SANS, + Typeface.NORMAL, + TypefaceCache.VARIATION_NORMAL); + ((TextView) view).setTypeface(type); + ((TextView) view).setTextSize(24); + ((TextView) view).setTextColor(getResources().getColor(R.color.wp_blue)); + } + } +} 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 f51c252d78d2..1dc4eda216ae 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 @@ -30,6 +30,7 @@ import android.widget.ListAdapter; import android.widget.ListView; import android.widget.NumberPicker; +import android.widget.RelativeLayout; import android.widget.TextView; import org.wordpress.android.R; @@ -465,7 +466,18 @@ private void showMultipleLinksDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); View view = View.inflate(getActivity(), R.layout.number_picker_dialog, null); final NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.number_picker); - numberPicker.setMaxValue(100); + TextView detailText = (TextView) view.findViewById(R.id.number_picker_text); + detailText.setTextColor(getResources().getColor(R.color.grey_darken_10)); + detailText.setText(R.string.multiple_links_description); + numberPicker.setMaxValue(getResources().getInteger(R.integer.max_links_limit)); + LayoutInflater inflater = LayoutInflater.from(getActivity()); + View titleView = inflater.inflate(R.layout.detail_list_preference_title, null); + TextView titleText = ((TextView) titleView.findViewById(R.id.title)); + titleText.setText(R.string.site_settings_multiple_links_title); + titleText.setLayoutParams(new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.WRAP_CONTENT)); + builder.setCustomTitle(titleView); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/WordPress/src/main/res/layout/number_picker_dialog.xml b/WordPress/src/main/res/layout/number_picker_dialog.xml index e3b1c775e52e..9b31166341f0 100644 --- a/WordPress/src/main/res/layout/number_picker_dialog.xml +++ b/WordPress/src/main/res/layout/number_picker_dialog.xml @@ -2,18 +2,24 @@ + android:orientation="vertical" + android:paddingLeft="@dimen/margin_extra_large" + android:paddingRight="@dimen/margin_extra_large"> + android:layout_height="wrap_content" + android:textSize="@dimen/text_sz_medium" + app:fontVariation="light" /> - + android:layout_height="wrap_content" + android:showDividers="none" /> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 99492837542e..445b87a73b7f 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -497,7 +497,7 @@ Users must be signed in Automatically approve comments Automatically approve - With multiple links + Links in comments Require manual approval for more than %d links Hold for Moderation Blacklist From ee12982cc7bb5e533667716457779905eb6179ba Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 16:44:09 -0800 Subject: [PATCH 161/250] Fixing (de)serialization of self-hosted options --- .../ui/prefs/SelfHostedSiteSettings.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java index 596816429730..eb44b8b960fd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SelfHostedSiteSettings.java @@ -203,9 +203,9 @@ private Map serializeSelfHostedParams() { } if (mSettings.closeCommentAfter != mRemoteSettings.closeCommentAfter) { if (mSettings.closeCommentAfter <= 0) { - params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(false)); + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(0)); } else { - params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(true)); + params.put(CLOSE_OLD_COMMENTS_KEY, String.valueOf(1)); params.put(CLOSE_OLD_COMMENTS_DAYS_KEY, String.valueOf(mSettings.closeCommentAfter)); } } @@ -218,17 +218,17 @@ private Map serializeSelfHostedParams() { } if (mSettings.threadingLevels != mRemoteSettings.threadingLevels) { if (mSettings.threadingLevels <= 1) { - params.put(THREAD_COMMENTS_KEY, String.valueOf(false)); + params.put(THREAD_COMMENTS_KEY, String.valueOf(0)); } else { - params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(PAGE_COMMENTS_KEY, String.valueOf(1)); params.put(THREAD_COMMENTS_DEPTH_KEY, String.valueOf(mSettings.threadingLevels)); } } if (mSettings.commentsPerPage != mRemoteSettings.commentsPerPage) { if (mSettings.commentsPerPage <= 0) { - params.put(PAGE_COMMENTS_KEY, String.valueOf(false)); + params.put(PAGE_COMMENTS_KEY, String.valueOf(0)); } else{ - params.put(PAGE_COMMENTS_KEY, String.valueOf(true)); + params.put(PAGE_COMMENTS_KEY, String.valueOf(1)); params.put(PAGE_COMMENT_COUNT_KEY, String.valueOf(mSettings.commentsPerPage)); } } @@ -288,7 +288,7 @@ private void deserializeOptionsResponse(SiteSettingsModel model, Map response) { model.commentApprovalRequired = !TextUtils.isEmpty(approvalRequired) && Integer.valueOf(approvalRequired) > 0; model.commentsRequireIdentity = !TextUtils.isEmpty(identityRequired) && Integer.valueOf(identityRequired) > 0; model.commentsRequireUserAccount = !TextUtils.isEmpty(accountRequired) && Integer.valueOf(accountRequired) > 0; - model.commentAutoApprovalKnownUsers = !TextUtils.isEmpty(knownUsers) && Integer.valueOf(knownUsers) > 0; + model.commentAutoApprovalKnownUsers = !TextUtils.isEmpty(knownUsers) && Boolean.valueOf(knownUsers); model.maxLinks = Integer.valueOf(getNestedMapValue(response, MAX_LINKS_KEY)); mRemoteSettings.holdForModeration = new ArrayList<>(); mRemoteSettings.blacklist = new ArrayList<>(); @@ -302,19 +302,22 @@ private void deserializeOptionsResponse(SiteSettingsModel model, Map response) { Collections.addAll(mRemoteSettings.blacklist, blacklistKeys.split("\n")); } - if (Boolean.valueOf(getNestedMapValue(response, CLOSE_OLD_COMMENTS_KEY))) { + String close = getNestedMapValue(response, CLOSE_OLD_COMMENTS_KEY); + if (!TextUtils.isEmpty(close) && Boolean.valueOf(close)) { mRemoteSettings.closeCommentAfter = Integer.valueOf(getNestedMapValue(response, CLOSE_OLD_COMMENTS_DAYS_KEY)); } else { mRemoteSettings.closeCommentAfter = 0; } - if (Boolean.valueOf(getNestedMapValue(response, THREAD_COMMENTS_KEY))) { + String thread = getNestedMapValue(response, THREAD_COMMENTS_KEY); + if (!TextUtils.isEmpty(thread) && Integer.valueOf(thread) > 0) { mRemoteSettings.threadingLevels = Integer.valueOf(getNestedMapValue(response, THREAD_COMMENTS_DEPTH_KEY)); } else { mRemoteSettings.threadingLevels = 0; } - if (Boolean.valueOf(getNestedMapValue(response, PAGE_COMMENTS_KEY))) { + String page = getNestedMapValue(response, PAGE_COMMENTS_KEY); + if (!TextUtils.isEmpty(page) && Boolean.valueOf(page)) { mRemoteSettings.commentsPerPage = Integer.valueOf(getNestedMapValue(response, PAGE_COMMENT_COUNT_KEY)); } else { mRemoteSettings.commentsPerPage = 0; From 2f1c85ac947a4d21e212600702a9398ea5d402d8 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 16:59:26 -0800 Subject: [PATCH 162/250] Implementing delete site button --- .../ui/prefs/SiteSettingsFragment.java | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 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 1dc4eda216ae..f7c3f56760d3 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,6 @@ package org.wordpress.android.ui.prefs; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; @@ -35,7 +36,11 @@ 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.stats.StatsWidgetProvider; +import org.wordpress.android.ui.stats.datasets.StatsTable; +import org.wordpress.android.util.AnalyticsUtils; import org.wordpress.android.util.CoreEvents; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; @@ -61,6 +66,8 @@ public class SiteSettingsFragment extends PreferenceFragment Dialog.OnDismissListener, SiteSettingsInterface.SiteSettingsListener { + public static final int RESULT_BLOG_REMOVED = Activity.RESULT_FIRST_USER; + private static final String ADDRESS_FORMAT_REGEX = "^(https?://(w{3})?|www\\.)"; private static final int RELATED_POSTS_REQUEST_CODE = 1; private static final int NO_REGION_LANG_CODE_LEN = 2; @@ -69,6 +76,7 @@ public class SiteSettingsFragment extends PreferenceFragment private Blog mBlog; private SiteSettingsInterface mSiteSettings; private List mEditingList; + private boolean mBlogDeleted; private EditTextPreference mTitlePref; private EditTextPreference mTaglinePref; @@ -97,6 +105,9 @@ public class SiteSettingsFragment extends PreferenceFragment private Preference mMultipleLinksPref; private Preference mModerationHoldPref; private Preference mBlacklistPref; + private Preference mRemoveSitePref; + private Preference mDeleteSitePref; + private Preference mStartOverPref; @Override public void onCreate(Bundle savedInstanceState) { @@ -132,7 +143,9 @@ public void onDestroy() { super.onDestroy(); // Assume user wanted changes propagated when they leave - mSiteSettings.saveSettings(); + if (!mBlogDeleted) { + mSiteSettings.saveSettings(); + } } @Override @@ -213,11 +226,58 @@ public boolean onPreferenceClick(Preference preference) { R.string.blacklist_description, mEditingList); return true; + } else if (preference == mDeleteSitePref) { + removeBlogWithConfirmation(); + } else if (preference == mRemoveSitePref) { + } else if (preference == mStartOverPref) { } return false; } + private void removeBlog() { + if (WordPress.wpDB.deleteBlog(getActivity(), mBlog.getLocalTableBlogId())) { + StatsTable.deleteStatsForBlog(getActivity(), mBlog.getLocalTableBlogId()); // Remove stats data + AnalyticsUtils.refreshMetadata(); + ToastUtils.showToast(getActivity(), R.string.blog_removed_successfully); + WordPress.wpDB.deleteLastBlogId(); + WordPress.currentBlog = null; + mBlogDeleted = true; + getActivity().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 CoreEvents.UserSignedOutCompletely()); + } + + // Checks for stats widgets that were synched with a blog that could be gone now. + StatsWidgetProvider.updateWidgetsOnLogout(getActivity()); + + getActivity().finish(); + } else { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + dialogBuilder.setTitle(getResources().getText(R.string.error)); + dialogBuilder.setMessage(getResources().getText(R.string.could_not_remove_account)); + dialogBuilder.setPositiveButton(R.string.ok, null); + dialogBuilder.setCancelable(true); + dialogBuilder.create().show(); + } + } + + private void removeBlogWithConfirmation() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + 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(); + } + @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { super.onPreferenceTreeClick(screen, preference); @@ -434,10 +494,16 @@ private void initPreferences() { mModerationHoldPref = getPref(R.string.pref_key_site_moderation_hold); mBlacklistPref = getPref(R.string.pref_key_site_blacklist); mRelatedPostsPref = findPreference(getString(R.string.pref_key_site_related_posts)); + mRemoveSitePref = findPreference(getString(R.string.pref_key_site_remove_site)); + mDeleteSitePref = findPreference(getString(R.string.pref_key_site_delete_site)); + mStartOverPref = findPreference(getString(R.string.pref_key_site_start_over)); mRelatedPostsPref.setOnPreferenceClickListener(this); mMultipleLinksPref.setOnPreferenceClickListener(this); mModerationHoldPref.setOnPreferenceClickListener(this); mBlacklistPref.setOnPreferenceClickListener(this); + mRemoveSitePref.setOnPreferenceClickListener(this); + mDeleteSitePref.setOnPreferenceClickListener(this); + mStartOverPref.setOnPreferenceClickListener(this); // .com sites hide the Account category, self-hosted sites hide the Related Posts preference if (mBlog.isDotcomFlag()) { From 38b91d9649be91775183ab749c3d397bd8ebdda7 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 12 Nov 2015 17:06:47 -0800 Subject: [PATCH 163/250] Removing Start Over and Remove Site options --- .../ui/prefs/SiteSettingsFragment.java | 12 +-------- WordPress/src/main/res/xml/site_settings.xml | 26 +++---------------- 2 files changed, 5 insertions(+), 33 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 f7c3f56760d3..8a6152e42864 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 @@ -105,9 +105,7 @@ public class SiteSettingsFragment extends PreferenceFragment private Preference mMultipleLinksPref; private Preference mModerationHoldPref; private Preference mBlacklistPref; - private Preference mRemoveSitePref; private Preference mDeleteSitePref; - private Preference mStartOverPref; @Override public void onCreate(Bundle savedInstanceState) { @@ -228,8 +226,6 @@ public boolean onPreferenceClick(Preference preference) { return true; } else if (preference == mDeleteSitePref) { removeBlogWithConfirmation(); - } else if (preference == mRemoveSitePref) { - } else if (preference == mStartOverPref) { } return false; @@ -494,26 +490,20 @@ private void initPreferences() { mModerationHoldPref = getPref(R.string.pref_key_site_moderation_hold); mBlacklistPref = getPref(R.string.pref_key_site_blacklist); mRelatedPostsPref = findPreference(getString(R.string.pref_key_site_related_posts)); - mRemoveSitePref = findPreference(getString(R.string.pref_key_site_remove_site)); mDeleteSitePref = findPreference(getString(R.string.pref_key_site_delete_site)); - mStartOverPref = findPreference(getString(R.string.pref_key_site_start_over)); mRelatedPostsPref.setOnPreferenceClickListener(this); mMultipleLinksPref.setOnPreferenceClickListener(this); mModerationHoldPref.setOnPreferenceClickListener(this); mBlacklistPref.setOnPreferenceClickListener(this); - mRemoveSitePref.setOnPreferenceClickListener(this); mDeleteSitePref.setOnPreferenceClickListener(this); - mStartOverPref.setOnPreferenceClickListener(this); // .com sites hide the Account category, self-hosted sites hide the Related Posts preference if (mBlog.isDotcomFlag()) { removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_account); - removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_remove_site); + removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_delete_site); } else { removePreference(R.string.pref_key_site_general, R.string.pref_key_site_language); removePreference(R.string.pref_key_site_writing, R.string.pref_key_site_related_posts); - removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_start_over); - removePreference(R.string.pref_key_site_screen, R.string.pref_key_site_delete_site); } } diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index f4a6334af2ee..7c5b9446df25 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -267,27 +267,9 @@ - - - - - - - - - - + From d0022d681b384a788ec74b1d33a72c0bb5c320b9 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 13 Nov 2015 17:11:37 -0800 Subject: [PATCH 164/250] Adding Action Mode to list editor dialog for removing items --- .../ui/prefs/SiteSettingsFragment.java | 105 ++++++++++++++---- .../android/util/WPActivityUtils.java | 9 ++ WordPress/src/main/res/menu/list_editor.xml | 13 +++ 3 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 WordPress/src/main/res/menu/list_editor.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 8a6152e42864..5c6893757cc7 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 @@ -19,12 +19,18 @@ import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.text.TextUtils; +import android.util.SparseBooleanArray; import android.util.TypedValue; +import android.view.ActionMode; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; +import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; @@ -770,7 +776,7 @@ private void updateWhitelistSettings(int val) { private void showListEditorDialog(int titleRes, int footerRes, List items) { Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); dialog.setOnDismissListener(this); - dialog.setContentView(getListEditorView(items, getString(footerRes))); + dialog.setContentView(getListEditorView(dialog, items, getString(footerRes))); dialog.show(); WPActivityUtils.addToolbarToDialog(this, dialog, getString(titleRes)); } @@ -782,37 +788,98 @@ private void setEditorListEntries(ListView list, List items) { items)); } - private View getListEditorView(List items, String footerText) { + private ActionMode mListEditorActionMode = null; + + private View getListEditorView(final Dialog dialog, List items, String footerText) { View view = View.inflate(getActivity(), R.layout.list_editor, null); ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); final ListView list = (ListView) view.findViewById(android.R.id.list); list.setEmptyView(view.findViewById(R.id.empty_view)); - setEditorListEntries(list, items); - view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { + list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override - public void onClick(View v) { - AlertDialog.Builder builder = - new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); - final EditText input = new WPEditText(getActivity()); - input.setHint("Enter a word or phrase"); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (mListEditorActionMode != null) return false; + + WPActivityUtils.changeDialogToolbarVisibility(dialog, View.GONE); + mListEditorActionMode = list.startActionMode(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.list_editor, menu); + return true; + } + @Override - public void onClick(DialogInterface dialog, int which) { - String entry = input.getText().toString(); - if (!mEditingList.contains(entry)) { - mEditingList.add(entry); + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + mode.setTitle(String.valueOf(list.getCheckedItemCount())); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == R.id.menu_delete) { + SparseBooleanArray checkedItems = list.getCheckedItemPositions(); + ListAdapter adapter = list.getAdapter(); + for (int i = 0; i < checkedItems.size(); i++) { + final int index = checkedItems.keyAt(i); + if (checkedItems.get(index) && mEditingList.size() > index) { + mEditingList.remove(adapter.getItem(index).toString()); + } + } + setEditorListEntries(list, mEditingList); + mListEditorActionMode.finish(); + return true; } + + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mListEditorActionMode = null; + WPActivityUtils.changeDialogToolbarVisibility(dialog, View.VISIBLE); } }); - builder.setNegativeButton(R.string.cancel, null); - AlertDialog alertDialog = builder.create(); - alertDialog.setView(input, 64, 64, 64, 0); - alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - alertDialog.show(); + + return true; } }); + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (mListEditorActionMode == null) return; + + mListEditorActionMode.invalidate(); + } + }); + setEditorListEntries(list, items); + view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = + new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + final EditText input = new WPEditText(getActivity()); + input.setHint("Enter a word or phrase"); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String entry = input.getText().toString(); + if (!mEditingList.contains(entry)) { + mEditingList.add(entry); + setEditorListEntries(list, mEditingList); + } + } + }); + builder.setNegativeButton(R.string.cancel, null); + AlertDialog alertDialog = builder.create(); + alertDialog.setView(input, 64, 64, 64, 0); + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + alertDialog.show(); + } + }); return view; } diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java index e18192ffc63c..efbd7938f835 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java @@ -82,6 +82,15 @@ public void onClick(View v) { }); } + public static void changeDialogToolbarVisibility(Dialog dialog, int visibility) { + if (dialog == null || !dialog.isShowing()) return; + + View toolbar = dialog.findViewById(R.id.toolbar); + if (toolbar != null) { + toolbar.setVisibility(visibility); + } + } + public static void applyLocale(Activity context, boolean restart) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); diff --git a/WordPress/src/main/res/menu/list_editor.xml b/WordPress/src/main/res/menu/list_editor.xml new file mode 100644 index 000000000000..a882dbe3122f --- /dev/null +++ b/WordPress/src/main/res/menu/list_editor.xml @@ -0,0 +1,13 @@ + + + + + + + From 408404e5b66d9cdb91f43e3c49928d0b41baab95 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 13 Nov 2015 17:15:08 -0800 Subject: [PATCH 165/250] Selecting originally long pressed item when entering Action Mode --- .../android/ui/prefs/SiteSettingsFragment.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 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 5c6893757cc7..c22f600bbc5f 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 @@ -803,6 +803,7 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l if (mListEditorActionMode != null) return false; WPActivityUtils.changeDialogToolbarVisibility(dialog, View.GONE); + list.setItemChecked(position, true); mListEditorActionMode = list.startActionMode(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { @@ -847,14 +848,14 @@ public void onDestroyActionMode(ActionMode mode) { return true; } }); - list.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (mListEditorActionMode == null) return; + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (mListEditorActionMode == null) return; - mListEditorActionMode.invalidate(); - } - }); + mListEditorActionMode.invalidate(); + } + }); setEditorListEntries(list, items); view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { @Override From ba7dc606b252c2e2dcff13262879dee85d5cff9f Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 16 Nov 2015 15:20:19 -0800 Subject: [PATCH 166/250] Adjusting Learn More spacing, fixing warnings, array index checking --- .../wordpress/android/ui/prefs/DetailListPreference.java | 9 +++++++-- WordPress/src/main/res/layout/learn_more_pref.xml | 1 + 2 files changed, 8 insertions(+), 2 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 4197d7a6bcbf..02cd10ed1751 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 @@ -130,16 +130,19 @@ public void onClick(DialogInterface dialog, int which) { if (listView != null) { listView.setDividerHeight(0); listView.setClipToPadding(true); + //noinspection deprecation listView.setBackgroundColor(res.getColor(R.color.grey_lighten_30)); listView.setPadding(0, 0, 0, res.getDimensionPixelSize(R.dimen.site_settings_divider_height)); } if (positive != null) { + //noinspection deprecation positive.setTextColor(res.getColor(R.color.blue_medium)); positive.setTypeface(typeface); } if (negative != null) { + //noinspection deprecation negative.setTextColor(res.getColor(R.color.blue_medium)); negative.setTypeface(typeface); } @@ -158,9 +161,10 @@ public void onDismiss(DialogInterface dialog) { @Override protected void onDialogClosed(boolean positiveResult) { + int index = positiveResult ? mSelectedIndex : mStartingIndex; CharSequence[] values = getEntryValues(); - if (values != null && mSelectedIndex < values.length && mSelectedIndex >= 0) { - String value = values[positiveResult ? mSelectedIndex : mStartingIndex].toString(); + if (values != null && index >= 0 && index < values.length) { + String value = values[index].toString(); callChangeListener(value); } } @@ -204,6 +208,7 @@ private void setupView(TextView view, int sizeRes, int enabledColorRes, int disa view.setTypeface(typeface); view.setTextSize(TypedValue.COMPLEX_UNIT_PX, res.getDimensionPixelSize(sizeRes)); + //noinspection deprecation view.setTextColor(res.getColor(isEnabled() ? enabledColorRes : disabledColorRes)); } } diff --git a/WordPress/src/main/res/layout/learn_more_pref.xml b/WordPress/src/main/res/layout/learn_more_pref.xml index eb2b78bbcd50..925e1a2e5566 100644 --- a/WordPress/src/main/res/layout/learn_more_pref.xml +++ b/WordPress/src/main/res/layout/learn_more_pref.xml @@ -25,6 +25,7 @@ android:id="@+id/learn_more_button" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="-12dp" android:gravity="start|center_vertical" android:background="@color/transparent" android:textStyle="bold" From 63271598f175adcfd0519310aede01d1716b0016 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 16 Nov 2015 16:44:11 -0800 Subject: [PATCH 167/250] Handling cases where selected value is not in the value set --- .../ui/prefs/DetailListPreference.java | 13 +-- .../ui/prefs/SiteSettingsFragment.java | 89 ++++++++++--------- 2 files changed, 54 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 02cd10ed1751..21087f1c5e79 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 @@ -31,7 +31,7 @@ public class DetailListPreference extends ListPreference implements PreferenceHint { private DetailListAdapter mListAdapter; private String[] mDetails; - private int mStartingIndex; + private String mStartingValue; private int mSelectedIndex; private String mHint; private AlertDialog mDialog; @@ -56,7 +56,7 @@ public DetailListPreference(Context context, AttributeSet attrs) { array.recycle(); - mStartingIndex = mSelectedIndex = 0; + mSelectedIndex = -1; } @Override @@ -84,7 +84,8 @@ protected void showDialog(Bundle state) { } mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); - mStartingIndex = mSelectedIndex = Math.max(0, findIndexOfValue(getValue())); + mStartingValue = getValue(); + mSelectedIndex = findIndexOfValue(mStartingValue); builder.setSingleChoiceItems(mListAdapter, mSelectedIndex, new DialogInterface.OnClickListener() { @@ -161,11 +162,13 @@ public void onDismiss(DialogInterface dialog) { @Override protected void onDialogClosed(boolean positiveResult) { - int index = positiveResult ? mSelectedIndex : mStartingIndex; + int index = positiveResult ? mSelectedIndex : findIndexOfValue(mStartingValue); CharSequence[] values = getEntryValues(); if (values != null && index >= 0 && index < values.length) { - String value = values[index].toString(); + String value = String.valueOf(values[index]); callChangeListener(value); + } else { + callChangeListener(mStartingValue); } } 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 c22f600bbc5f..b65f4c5a04f8 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,6 @@ package org.wordpress.android.ui.prefs; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -237,49 +238,6 @@ public boolean onPreferenceClick(Preference preference) { return false; } - private void removeBlog() { - if (WordPress.wpDB.deleteBlog(getActivity(), mBlog.getLocalTableBlogId())) { - StatsTable.deleteStatsForBlog(getActivity(), mBlog.getLocalTableBlogId()); // Remove stats data - AnalyticsUtils.refreshMetadata(); - ToastUtils.showToast(getActivity(), R.string.blog_removed_successfully); - WordPress.wpDB.deleteLastBlogId(); - WordPress.currentBlog = null; - mBlogDeleted = true; - getActivity().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 CoreEvents.UserSignedOutCompletely()); - } - - // Checks for stats widgets that were synched with a blog that could be gone now. - StatsWidgetProvider.updateWidgetsOnLogout(getActivity()); - - getActivity().finish(); - } else { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); - dialogBuilder.setTitle(getResources().getText(R.string.error)); - dialogBuilder.setMessage(getResources().getText(R.string.could_not_remove_account)); - dialogBuilder.setPositiveButton(R.string.ok, null); - dialogBuilder.setCancelable(true); - dialogBuilder.create().show(); - } - } - - private void removeBlogWithConfirmation() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); - 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(); - } - @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { super.onPreferenceTreeClick(screen, preference); @@ -529,10 +487,12 @@ private void showMultipleLinksDialog() { View view = View.inflate(getActivity(), R.layout.number_picker_dialog, null); final NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.number_picker); TextView detailText = (TextView) view.findViewById(R.id.number_picker_text); + //noinspection deprecation detailText.setTextColor(getResources().getColor(R.color.grey_darken_10)); detailText.setText(R.string.multiple_links_description); numberPicker.setMaxValue(getResources().getInteger(R.integer.max_links_limit)); LayoutInflater inflater = LayoutInflater.from(getActivity()); + @SuppressLint("InflateParams") View titleView = inflater.inflate(R.layout.detail_list_preference_title, null); TextView titleText = ((TextView) titleView.findViewById(R.id.title)); titleText.setText(R.string.site_settings_multiple_links_title); @@ -885,6 +845,49 @@ public void onClick(DialogInterface dialog, int which) { return view; } + private void removeBlog() { + if (WordPress.wpDB.deleteBlog(getActivity(), mBlog.getLocalTableBlogId())) { + StatsTable.deleteStatsForBlog(getActivity(), mBlog.getLocalTableBlogId()); // Remove stats data + AnalyticsUtils.refreshMetadata(); + ToastUtils.showToast(getActivity(), R.string.blog_removed_successfully); + WordPress.wpDB.deleteLastBlogId(); + WordPress.currentBlog = null; + mBlogDeleted = true; + getActivity().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 CoreEvents.UserSignedOutCompletely()); + } + + // Checks for stats widgets that were synched with a blog that could be gone now. + StatsWidgetProvider.updateWidgetsOnLogout(getActivity()); + + getActivity().finish(); + } else { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + dialogBuilder.setTitle(getResources().getText(R.string.error)); + dialogBuilder.setMessage(getResources().getText(R.string.could_not_remove_account)); + dialogBuilder.setPositiveButton(R.string.ok, null); + dialogBuilder.setCancelable(true); + dialogBuilder.create().show(); + } + } + + private void removeBlogWithConfirmation() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + 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(); + } + /** * Generates display strings for given language codes. Used as entries in language preference. */ From ed99b4eeb1c95a06444999625a4e43646e44da41 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 16 Nov 2015 16:45:12 -0800 Subject: [PATCH 168/250] Initializing language value. Moving to selected value in number picker --- .../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 b65f4c5a04f8..e2eefcc084b4 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 @@ -491,6 +491,7 @@ private void showMultipleLinksDialog() { detailText.setTextColor(getResources().getColor(R.color.grey_darken_10)); detailText.setText(R.string.multiple_links_description); numberPicker.setMaxValue(getResources().getInteger(R.integer.max_links_limit)); + numberPicker.setValue(Math.max(numberPicker.getMinValue(), Math.min(numberPicker.getMaxValue(), mSiteSettings.getMultipleLinks()))); LayoutInflater inflater = LayoutInflater.from(getActivity()); @SuppressLint("InflateParams") View titleView = inflater.inflate(R.layout.detail_list_preference_title, null); @@ -520,6 +521,7 @@ private void setPreferencesFromSiteSettings() { changeEditTextPreferenceValue(mAddressPref, mSiteSettings.getAddress()); changeEditTextPreferenceValue(mUsernamePref, mSiteSettings.getUsername()); changeEditTextPreferenceValue(mPasswordPref, mSiteSettings.getPassword()); + changeLanguageValue(mSiteSettings.getLanguageCode()); setDetailListPreferenceValue(mPrivacyPref, String.valueOf(mSiteSettings.getPrivacy()), getPrivacySummary(mSiteSettings.getPrivacy())); @@ -643,6 +645,9 @@ private void changeEditTextPreferenceValue(EditTextPreference pref, String newVa /** * Detail strings for the dialog are generated in the selected language. + * + * @param newValue + * languageCode */ private void changeLanguageValue(String newValue) { if (mLanguagePref == null || newValue == null) return; From a59cde7871d5dc4f22240bf875bdfdddc95c6d76 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 16 Nov 2015 16:47:14 -0800 Subject: [PATCH 169/250] Removing redundant method in favor of existing utility method --- .../android/ui/prefs/SiteSettingsFragment.java | 13 ++++--------- 1 file changed, 4 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 e2eefcc084b4..a96f58fbc1ea 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 @@ -902,8 +902,8 @@ private String[] createLanguageDisplayStrings(CharSequence[] languageCodes) { String[] displayStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - displayStrings[i] = capitalizeFrontOfString(getLanguageString( - String.valueOf(languageCodes[i]), languageLocale(languageCodes[i].toString())), 1); + displayStrings[i] = StringUtils.capitalize(getLanguageString( + String.valueOf(languageCodes[i]), languageLocale(languageCodes[i].toString()))); } return displayStrings; @@ -918,8 +918,8 @@ public String[] createLanguageDetailDisplayStrings(CharSequence[] languageCodes, String[] detailStrings = new String[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - detailStrings[i] = capitalizeFrontOfString( - getLanguageString(languageCodes[i].toString(), languageLocale(locale)), 1); + detailStrings[i] = StringUtils.capitalize( + getLanguageString(languageCodes[i].toString(), languageLocale(locale))); } return detailStrings; @@ -973,9 +973,4 @@ private Locale languageLocale(String languageCode) { return new Locale(languageCode); } - - private String capitalizeFrontOfString(String input, int numToCap) { - if (TextUtils.isEmpty(input)) return ""; - return input.substring(0, numToCap).toUpperCase() + input.substring(numToCap); - } } From 937582e7e0a924db76a1cb61ab2b4e711832b23f Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 17 Nov 2015 10:57:03 -0800 Subject: [PATCH 170/250] Encapsulating multi-select functionality --- .../android/ui/prefs/MultiSelectListView.java | 100 ++++++++++ .../ui/prefs/SiteSettingsFragment.java | 179 +++++++----------- 2 files changed, 170 insertions(+), 109 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java new file mode 100644 index 000000000000..78372683f8c3 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java @@ -0,0 +1,100 @@ +package org.wordpress.android.ui.prefs; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; + +import org.wordpress.android.R; + +public class MultiSelectListView extends ListView + implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener { + public interface OnEnterMultiSelect { + void onEnterMultiSelect(); + } + + public interface OnExitMultiSelect { + void onExitMultiSelect(); + } + + public interface OnDeleteRequested { + boolean onDeleteRequested(); + } + + private OnEnterMultiSelect mEnterListener; + private OnExitMultiSelect mExitListener; + private OnDeleteRequested mDeleteListener; + private ActionMode mActionMode; + + public MultiSelectListView(Context context, AttributeSet attrs) { + super(context, attrs); + setOnItemClickListener(this); + setOnItemLongClickListener(this); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (mActionMode == null) return; + + mActionMode.invalidate(); + } + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (mActionMode != null) return false; + if (mEnterListener != null) mEnterListener.onEnterMultiSelect(); + + setItemChecked(position, true); + mActionMode = startActionMode(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.list_editor, menu); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + mode.setTitle(String.valueOf(getCheckedItemCount())); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == R.id.menu_delete) { + if (mDeleteListener == null || mDeleteListener.onDeleteRequested()) { + mActionMode.finish(); + } + return true; + } + + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + if (mExitListener != null) mExitListener.onExitMultiSelect(); + } + }); + + return true; + } + + public void setEnterMultiSelectListener(OnEnterMultiSelect listener) { + mEnterListener = listener; + } + + public void setExitMultiSelectListener(OnExitMultiSelect listener) { + mExitListener = listener; + } + + public void setDeleteRequestListener(OnDeleteRequested listener) { + mDeleteListener = listener; + } +} 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 a96f58fbc1ea..14a30aca0bb4 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 @@ -22,12 +22,8 @@ import android.text.TextUtils; import android.util.SparseBooleanArray; import android.util.TypedValue; -import android.view.ActionMode; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -122,7 +118,6 @@ public void onCreate(Bundle savedInstanceState) { mBlog = WordPress.getBlog( getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); - // TODO: offline editing if (!NetworkUtils.checkConnection(getActivity()) || mBlog == null) { getActivity().finish(); return; @@ -222,14 +217,12 @@ public boolean onPreferenceClick(Preference preference) { } else if (preference == mModerationHoldPref) { mEditingList = mSiteSettings.getModerationKeys(); showListEditorDialog(R.string.site_settings_moderation_hold_title, - R.string.hold_for_moderation_description, - mEditingList); + R.string.hold_for_moderation_description); return true; } else if (preference == mBlacklistPref) { mEditingList = mSiteSettings.getBlacklistKeys(); showListEditorDialog(R.string.site_settings_blacklist_title, - R.string.blacklist_description, - mEditingList); + R.string.blacklist_description); return true; } else if (preference == mDeleteSitePref) { removeBlogWithConfirmation(); @@ -738,114 +731,79 @@ private void updateWhitelistSettings(int val) { getWhitelistSummary(val)); } - private void showListEditorDialog(int titleRes, int footerRes, List items) { + private void showListEditorDialog(int titleRes, int footerRes) { Dialog dialog = new Dialog(getActivity(), R.style.Calypso_SiteSettingsTheme); dialog.setOnDismissListener(this); - dialog.setContentView(getListEditorView(dialog, items, getString(footerRes))); + dialog.setContentView(getListEditorView(dialog, getString(footerRes))); dialog.show(); WPActivityUtils.addToolbarToDialog(this, dialog, getString(titleRes)); } - private void setEditorListEntries(ListView list, List items) { - if (list == null || items == null) return; - list.setAdapter(new ArrayAdapter<>(getActivity(), - R.layout.wp_simple_list_item_1, - items)); - } - - private ActionMode mListEditorActionMode = null; - - private View getListEditorView(final Dialog dialog, List items, String footerText) { + private View getListEditorView(final Dialog dialog, String footerText) { View view = View.inflate(getActivity(), R.layout.list_editor, null); ((TextView) view.findViewById(R.id.list_editor_footer_text)).setText(footerText); - final ListView list = (ListView) view.findViewById(android.R.id.list); - list.setEmptyView(view.findViewById(R.id.empty_view)); - list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); - list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + final MultiSelectListView list = (MultiSelectListView) view.findViewById(android.R.id.list); + list.setEnterMultiSelectListener(new MultiSelectListView.OnEnterMultiSelect() { @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (mListEditorActionMode != null) return false; - + public void onEnterMultiSelect() { WPActivityUtils.changeDialogToolbarVisibility(dialog, View.GONE); - list.setItemChecked(position, true); - mListEditorActionMode = list.startActionMode(new ActionMode.Callback() { - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.list_editor, menu); - return true; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - mode.setTitle(String.valueOf(list.getCheckedItemCount())); - return true; - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (item.getItemId() == R.id.menu_delete) { - SparseBooleanArray checkedItems = list.getCheckedItemPositions(); - ListAdapter adapter = list.getAdapter(); - for (int i = 0; i < checkedItems.size(); i++) { - final int index = checkedItems.keyAt(i); - if (checkedItems.get(index) && mEditingList.size() > index) { - mEditingList.remove(adapter.getItem(index).toString()); - } - } - - setEditorListEntries(list, mEditingList); - mListEditorActionMode.finish(); - return true; - } - - return false; - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - mListEditorActionMode = null; - WPActivityUtils.changeDialogToolbarVisibility(dialog, View.VISIBLE); - } - }); - - return true; } }); - list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + list.setExitMultiSelectListener(new MultiSelectListView.OnExitMultiSelect() { @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (mListEditorActionMode == null) return; - - mListEditorActionMode.invalidate(); + public void onExitMultiSelect() { + WPActivityUtils.changeDialogToolbarVisibility(dialog, View.VISIBLE); + } + }); + list.setDeleteRequestListener(new MultiSelectListView.OnDeleteRequested() { + @Override + public boolean onDeleteRequested() { + SparseBooleanArray checkedItems = list.getCheckedItemPositions(); + ListAdapter adapter = list.getAdapter(); + for (int i = 0; i < checkedItems.size(); i++) { + final int index = checkedItems.keyAt(i); + if (checkedItems.get(index) && mEditingList.size() > index) { + mEditingList.remove(adapter.getItem(index).toString()); + } + } + list.setAdapter(new ArrayAdapter<>(getActivity(), + R.layout.wp_simple_list_item_1, + mEditingList)); + return true; } }); - setEditorListEntries(list, items); - view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { + list.setEmptyView(view.findViewById(R.id.empty_view)); + list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + list.setAdapter(new ArrayAdapter<>(getActivity(), + R.layout.wp_simple_list_item_1, + mEditingList)); + view.findViewById(R.id.fab_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = + new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); + final EditText input = new WPEditText(getActivity()); + input.setHint("Enter a word or phrase"); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override - public void onClick(View v) { - AlertDialog.Builder builder = - new AlertDialog.Builder(getActivity(), R.style.Calypso_AlertDialog); - final EditText input = new WPEditText(getActivity()); - input.setHint("Enter a word or phrase"); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String entry = input.getText().toString(); - if (!mEditingList.contains(entry)) { - mEditingList.add(entry); - setEditorListEntries(list, mEditingList); - } - } - }); - builder.setNegativeButton(R.string.cancel, null); - AlertDialog alertDialog = builder.create(); - alertDialog.setView(input, 64, 64, 64, 0); - alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - alertDialog.show(); + public void onClick(DialogInterface dialog, int which) { + String entry = input.getText().toString(); + if (!mEditingList.contains(entry)) { + mEditingList.add(entry); + list.setAdapter(new ArrayAdapter<>(getActivity(), + R.layout.wp_simple_list_item_1, + mEditingList)); + } } }); + builder.setNegativeButton(R.string.cancel, null); + AlertDialog alertDialog = builder.create(); + alertDialog.setView(input, 64, 64, 64, 0); + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + alertDialog.show(); + } + }); return view; } @@ -943,6 +901,20 @@ private String getLanguageString(String languageCode, Locale displayLocale) { return displayLanguage; } + /** + * Gets a locale for the given language code. + */ + private Locale languageLocale(String languageCode) { + if (TextUtils.isEmpty(languageCode)) return Locale.getDefault(); + + if (languageCode.length() > NO_REGION_LANG_CODE_LEN) { + return new Locale(languageCode.substring(0, NO_REGION_LANG_CODE_LEN), + languageCode.substring(REGION_SUBSTRING_INDEX)); + } + + return new Locale(languageCode); + } + /** * Gets a preference and sets the {@link android.preference.Preference.OnPreferenceChangeListener}. */ @@ -962,15 +934,4 @@ private void removePreference(int parentKey, int preference) { parent.removePreference(findPreference(getString(preference))); } } - - private Locale languageLocale(String languageCode) { - if (TextUtils.isEmpty(languageCode)) return Locale.getDefault(); - - if (languageCode.length() > NO_REGION_LANG_CODE_LEN) { - return new Locale(languageCode.substring(0, NO_REGION_LANG_CODE_LEN), - languageCode.substring(REGION_SUBSTRING_INDEX)); - } - - return new Locale(languageCode); - } } From 581bdbd73638410dd04cd4d73827d569363e2e55 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 17 Nov 2015 13:48:53 -0800 Subject: [PATCH 171/250] Using MultiSelectListView in list editor layout --- .../ui/prefs/BlogPreferencesActivity.java | 2 +- .../android/ui/prefs/MultiSelectListView.java | 68 +++++++++++-------- .../ui/prefs/SiteSettingsFragment.java | 4 +- WordPress/src/main/res/layout/list_editor.xml | 2 +- 4 files changed, 43 insertions(+), 33 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 597f20fdcd63..f06074a84d15 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 @@ -21,7 +21,7 @@ * Activity for configuring blog specific settings. */ public class BlogPreferencesActivity extends AppCompatActivity { - public static final String ARG_LOCAL_BLOG_ID = "local_blog_id"; + public static final String ARG_LOCAL_BLOG_ID = SiteSettingsFragment.ARG_LOCAL_BLOG_ID; public static final int RESULT_BLOG_REMOVED = RESULT_FIRST_USER; private static final String KEY_SETTINGS_FRAGMENT = "settings-fragment"; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java index 78372683f8c3..f4bd03476cbd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java @@ -12,8 +12,14 @@ import org.wordpress.android.R; +/** + * ListView that supports multiple item selection and provides a delete button. + */ public class MultiSelectListView extends ListView - implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener { + implements AdapterView.OnItemLongClickListener, + AdapterView.OnItemClickListener, + ActionMode.Callback { + public interface OnEnterMultiSelect { void onEnterMultiSelect(); } @@ -23,6 +29,10 @@ public interface OnExitMultiSelect { } public interface OnDeleteRequested { + /** + * @return + * true to exit Action Mode + */ boolean onDeleteRequested(); } @@ -50,40 +60,40 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l if (mEnterListener != null) mEnterListener.onEnterMultiSelect(); setItemChecked(position, true); - mActionMode = startActionMode(new ActionMode.Callback() { - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.list_editor, menu); - return true; - } + mActionMode = startActionMode(this); - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - mode.setTitle(String.valueOf(getCheckedItemCount())); - return true; - } + return true; + } - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (item.getItemId() == R.id.menu_delete) { - if (mDeleteListener == null || mDeleteListener.onDeleteRequested()) { - mActionMode.finish(); - } - return true; - } + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.list_editor, menu); + return true; + } - return false; - } + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + mode.setTitle(String.valueOf(getCheckedItemCount())); + return true; + } - @Override - public void onDestroyActionMode(ActionMode mode) { - mActionMode = null; - if (mExitListener != null) mExitListener.onExitMultiSelect(); + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == R.id.menu_delete) { + if (mDeleteListener == null || mDeleteListener.onDeleteRequested()) { + mActionMode.finish(); } - }); + return true; + } - return true; + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + if (mExitListener != null) mExitListener.onExitMultiSelect(); } public void setEnterMultiSelectListener(OnEnterMultiSelect listener) { 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 14a30aca0bb4..2ebc3389d4a9 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 @@ -69,6 +69,7 @@ public class SiteSettingsFragment extends PreferenceFragment Dialog.OnDismissListener, SiteSettingsInterface.SiteSettingsListener { + public static final String ARG_LOCAL_BLOG_ID = "local_blog_id"; public static final int RESULT_BLOG_REMOVED = Activity.RESULT_FIRST_USER; private static final String ADDRESS_FORMAT_REGEX = "^(https?://(w{3})?|www\\.)"; @@ -115,8 +116,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // make sure we have local site data - mBlog = WordPress.getBlog( - getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); + mBlog = WordPress.getBlog(getArguments().getInt(ARG_LOCAL_BLOG_ID, -1)); if (!NetworkUtils.checkConnection(getActivity()) || mBlog == null) { getActivity().finish(); diff --git a/WordPress/src/main/res/layout/list_editor.xml b/WordPress/src/main/res/layout/list_editor.xml index 51b3630f501b..33d971a96ab7 100644 --- a/WordPress/src/main/res/layout/list_editor.xml +++ b/WordPress/src/main/res/layout/list_editor.xml @@ -16,7 +16,7 @@ android:textSize="@dimen/text_sz_large" android:visibility="gone" /> - From 5f4978a58019e5236eb9a12a9fa12e3c72d7ea91 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 17 Nov 2015 14:05:10 -0800 Subject: [PATCH 172/250] Ending Action Mode if the last item is deselected --- .../org/wordpress/android/ui/prefs/MultiSelectListView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java index f4bd03476cbd..c21af32f3030 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MultiSelectListView.java @@ -51,7 +51,11 @@ public MultiSelectListView(Context context, AttributeSet attrs) { public void onItemClick(AdapterView parent, View view, int position, long id) { if (mActionMode == null) return; - mActionMode.invalidate(); + if (getCheckedItemCount() <= 0) { + mActionMode.finish(); + } else { + mActionMode.invalidate(); + } } @Override From 870df76234af092981e7bb026e66ef82c6046ad6 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 17 Nov 2015 14:30:37 -0800 Subject: [PATCH 173/250] Styling list editor action mode --- WordPress/src/main/res/values/styles_calypso.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WordPress/src/main/res/values/styles_calypso.xml b/WordPress/src/main/res/values/styles_calypso.xml index fb85ba34b260..779a6b97e338 100644 --- a/WordPress/src/main/res/values/styles_calypso.xml +++ b/WordPress/src/main/res/values/styles_calypso.xml @@ -8,6 +8,7 @@ @style/Calypso.PopupMenu @style/Calypso.TextAppearance @style/Calypso.TextAppearance + @style/Calypso.ActionMode + + + + - + + - -