Always remove TextWatcher when finished with it.

This commit is contained in:
Dmitry Brant 2017-05-26 15:44:11 -04:00
parent 40c1ea375a
commit 94e0e5e254
4 changed files with 113 additions and 105 deletions

View file

@ -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();
}

View file

@ -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) {
}
}
}

View file

@ -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) {
}
}
}

View file

@ -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();
}
}
}
}