From 94e0e5e254b9c98adefe875317caabbaced47222 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 26 May 2017 15:44:11 -0400 Subject: [PATCH] Always remove TextWatcher when finished with it. --- .../free/nrw/commons/auth/LoginActivity.java | 48 +++++++------- .../category/CategorizationFragment.java | 57 +++++++++-------- .../upload/MultipleUploadListFragment.java | 64 ++++++++++--------- .../commons/upload/SingleUploadFragment.java | 49 +++++++------- 4 files changed, 113 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 0bec4bac6..c4b97de38 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -30,9 +30,10 @@ public class LoginActivity extends AccountAuthenticatorActivity { private Button loginButton; private EditText usernameEdit; - EditText passwordEdit; - EditText twoFactorEdit; + private EditText passwordEdit; + private EditText twoFactorEdit; ProgressDialog progressDialog; + private LoginTextWatcher textWatcher = new LoginTextWatcher(); private CommonsApplication app; @@ -53,10 +54,9 @@ public class LoginActivity extends AccountAuthenticatorActivity { prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); - TextWatcher loginEnabler = newLoginTextWatcher(); - usernameEdit.addTextChangedListener(loginEnabler); - passwordEdit.addTextChangedListener(loginEnabler); - twoFactorEdit.addTextChangedListener(loginEnabler); + usernameEdit.addTextChangedListener(textWatcher); + passwordEdit.addTextChangedListener(textWatcher); + twoFactorEdit.addTextChangedListener(textWatcher); passwordEdit.setOnEditorActionListener( newLoginInputActionListener() ); loginButton.setOnClickListener(new View.OnClickListener() { @@ -71,27 +71,24 @@ public class LoginActivity extends AccountAuthenticatorActivity { }); } - private TextWatcher newLoginTextWatcher() { - return new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { } + private class LoginTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { + } - @Override - public void onTextChanged(CharSequence charSequence, int start, int count, int after) { } + @Override + public void onTextChanged(CharSequence charSequence, int start, int count, int after) { + } - @Override - public void afterTextChanged(Editable editable) { - if( - usernameEdit.getText().length() != 0 && - passwordEdit.getText().length() != 0 && - ( BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE ) - ) { - loginButton.setEnabled(true); - } else { - loginButton.setEnabled(false); - } + @Override + public void afterTextChanged(Editable editable) { + if (usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0 && + (BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE)) { + loginButton.setEnabled(true); + } else { + loginButton.setEnabled(false); } - }; + } } private TextView.OnEditorActionListener newLoginInputActionListener() { @@ -138,6 +135,9 @@ public class LoginActivity extends AccountAuthenticatorActivity { } catch (Exception e) { e.printStackTrace(); } + usernameEdit.removeTextChangedListener(textWatcher); + passwordEdit.removeTextChangedListener(textWatcher); + twoFactorEdit.removeTextChangedListener(textWatcher); super.onDestroy(); } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index ab63ef632..3af2f6473 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -1,6 +1,5 @@ package fr.free.nrw.commons.category; -import android.app.Activity; import android.content.ContentProviderClient; import android.content.DialogInterface; import android.content.SharedPreferences; @@ -58,6 +57,7 @@ public class CategorizationFragment extends Fragment { ProgressBar categoriesSearchInProgress; TextView categoriesNotFoundView; TextView categoriesSkip; + private CategoryTextWatcher textWatcher = new CategoryTextWatcher(); CategoriesAdapter categoriesAdapter; ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); @@ -442,21 +442,7 @@ public class CategorizationFragment extends Fragment { } }); - categoriesFilter.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { - startUpdatingCategoryList(); - } - - @Override - public void afterTextChanged(Editable editable) { - - } - }); + categoriesFilter.addTextChangedListener(textWatcher); startUpdatingCategoryList(); @@ -469,14 +455,6 @@ public class CategorizationFragment extends Fragment { inflater.inflate(R.menu.fragment_categorization, menu); } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - getActivity().setTitle(R.string.categories_activity_title); - client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY); - } - @Override public void onResume() { super.onResume(); @@ -498,6 +476,12 @@ public class CategorizationFragment extends Fragment { } } + @Override + public void onDestroyView() { + categoriesFilter.removeTextChangedListener(textWatcher); + super.onDestroyView(); + } + public void backButtonDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); @@ -581,8 +565,27 @@ public class CategorizationFragment extends Fragment { } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - onCategoriesSaveHandler = (OnCategoriesSaveHandler) activity; + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setHasOptionsMenu(true); + onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity(); + getActivity().setTitle(R.string.categories_activity_title); + client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY); + } + + private class CategoryTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + startUpdatingCategoryList(); + } + + @Override + public void afterTextChanged(Editable editable) { + + } } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java index 52da98f54..8db2ad641 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java @@ -39,6 +39,7 @@ public class MultipleUploadListFragment extends Fragment { private GridView photosGrid; private PhotoDisplayAdapter photosAdapter; private EditText baseTitle; + private TitleTextWatcher textWatcher = new TitleTextWatcher(); private Point photoSize; private MediaDetailPagerFragment.MediaDetailProvider detailProvider; @@ -88,7 +89,6 @@ public class MultipleUploadListFragment extends Fragment { holder = (UploadHolderView)view.getTag(); } - Contribution up = (Contribution)this.getItem(i); if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) { @@ -161,37 +161,16 @@ public class MultipleUploadListFragment extends Fragment { photoSize = calculatePicDimension(detailProvider.getTotalMediaCount()); photosGrid.setColumnWidth(photoSize.x); - baseTitle.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) { - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) { - for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) { - Contribution up = (Contribution) detailProvider.getMediaAtPosition(i); - Boolean isDirty = (Boolean)up.getTag("isDirty"); - if(isDirty == null || !isDirty) { - if(!TextUtils.isEmpty(charSequence)) { - up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1)); - } else { - up.setFilename(""); - } - } - } - detailProvider.notifyDatasetChanged(); - } - - @Override - public void afterTextChanged(Editable editable) { - - } - }); - + baseTitle.addTextChangedListener(textWatcher); return view; } + @Override + public void onDestroyView() { + baseTitle.removeTextChangedListener(textWatcher); + super.onDestroyView(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); @@ -218,5 +197,30 @@ public class MultipleUploadListFragment extends Fragment { setHasOptionsMenu(true); } - + + private class TitleTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) { + } + + @Override + public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) { + for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) { + Contribution up = (Contribution) detailProvider.getMediaAtPosition(i); + Boolean isDirty = (Boolean)up.getTag("isDirty"); + if(isDirty == null || !isDirty) { + if(!TextUtils.isEmpty(charSequence)) { + up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1)); + } else { + up.setFilename(""); + } + } + } + detailProvider.notifyDatasetChanged(); + } + + @Override + public void afterTextChanged(Editable editable) { + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index 2cf23318c..08e2f6050 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -1,6 +1,5 @@ package fr.free.nrw.commons.upload; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -53,6 +52,7 @@ public class SingleUploadFragment extends Fragment { @BindView(R.id.licenseSpinner) Spinner licenseSpinner; private OnUploadActionInitiated uploadActionInitiatedHandler; + private TitleTextWatcher textWatcher = new TitleTextWatcher(); @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { @@ -125,28 +125,19 @@ public class SingleUploadFragment extends Fragment { Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license))); licenseSpinner.setSelection(position); - TextWatcher uploadEnabler = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {} - - @Override - public void afterTextChanged(Editable editable) { - if(getActivity() != null) { - getActivity().invalidateOptionsMenu(); - } - } - }; - - titleEdit.addTextChangedListener(uploadEnabler); + titleEdit.addTextChangedListener(textWatcher); setLicenseSummary(license); return rootView; } + @Override + public void onDestroyView() { + titleEdit.removeTextChangedListener(textWatcher); + super.onDestroyView(); + } + @OnItemSelected(R.id.licenseSpinner) void onLicenseSelected(AdapterView parent, View view, int position, long id) { String licenseName = parent.getItemAtPosition(position).toString(); @@ -206,9 +197,10 @@ public class SingleUploadFragment extends Fragment { } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - uploadActionInitiatedHandler = (OnUploadActionInitiated) activity; + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setHasOptionsMenu(true); + uploadActionInitiatedHandler = (OnUploadActionInitiated) getActivity(); } @Override @@ -223,9 +215,18 @@ public class SingleUploadFragment extends Fragment { } } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); + private class TitleTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } + + @Override + public void afterTextChanged(Editable editable) { + if(getActivity() != null) { + getActivity().invalidateOptionsMenu(); + } + } } }