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 Button loginButton;
private EditText usernameEdit; private EditText usernameEdit;
EditText passwordEdit; private EditText passwordEdit;
EditText twoFactorEdit; private EditText twoFactorEdit;
ProgressDialog progressDialog; ProgressDialog progressDialog;
private LoginTextWatcher textWatcher = new LoginTextWatcher();
private CommonsApplication app; private CommonsApplication app;
@ -53,10 +54,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE);
TextWatcher loginEnabler = newLoginTextWatcher(); usernameEdit.addTextChangedListener(textWatcher);
usernameEdit.addTextChangedListener(loginEnabler); passwordEdit.addTextChangedListener(textWatcher);
passwordEdit.addTextChangedListener(loginEnabler); twoFactorEdit.addTextChangedListener(textWatcher);
twoFactorEdit.addTextChangedListener(loginEnabler);
passwordEdit.setOnEditorActionListener( newLoginInputActionListener() ); passwordEdit.setOnEditorActionListener( newLoginInputActionListener() );
loginButton.setOnClickListener(new View.OnClickListener() { loginButton.setOnClickListener(new View.OnClickListener() {
@ -71,27 +71,24 @@ public class LoginActivity extends AccountAuthenticatorActivity {
}); });
} }
private TextWatcher newLoginTextWatcher() { private class LoginTextWatcher implements TextWatcher {
return new TextWatcher() { @Override
@Override public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { } }
@Override @Override
public void onTextChanged(CharSequence charSequence, int start, int count, int after) { } public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override @Override
public void afterTextChanged(Editable editable) { public void afterTextChanged(Editable editable) {
if( if (usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0 &&
usernameEdit.getText().length() != 0 && (BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE)) {
passwordEdit.getText().length() != 0 && loginButton.setEnabled(true);
( BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE ) } else {
) { loginButton.setEnabled(false);
loginButton.setEnabled(true);
} else {
loginButton.setEnabled(false);
}
} }
}; }
} }
private TextView.OnEditorActionListener newLoginInputActionListener() { private TextView.OnEditorActionListener newLoginInputActionListener() {
@ -138,6 +135,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
usernameEdit.removeTextChangedListener(textWatcher);
passwordEdit.removeTextChangedListener(textWatcher);
twoFactorEdit.removeTextChangedListener(textWatcher);
super.onDestroy(); super.onDestroy();
} }

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons.category; package fr.free.nrw.commons.category;
import android.app.Activity;
import android.content.ContentProviderClient; import android.content.ContentProviderClient;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -58,6 +57,7 @@ public class CategorizationFragment extends Fragment {
ProgressBar categoriesSearchInProgress; ProgressBar categoriesSearchInProgress;
TextView categoriesNotFoundView; TextView categoriesNotFoundView;
TextView categoriesSkip; TextView categoriesSkip;
private CategoryTextWatcher textWatcher = new CategoryTextWatcher();
CategoriesAdapter categoriesAdapter; CategoriesAdapter categoriesAdapter;
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
@ -442,21 +442,7 @@ public class CategorizationFragment extends Fragment {
} }
}); });
categoriesFilter.addTextChangedListener(new TextWatcher() { categoriesFilter.addTextChangedListener(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) {
}
});
startUpdatingCategoryList(); startUpdatingCategoryList();
@ -469,14 +455,6 @@ public class CategorizationFragment extends Fragment {
inflater.inflate(R.menu.fragment_categorization, menu); 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 @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
@ -498,6 +476,12 @@ public class CategorizationFragment extends Fragment {
} }
} }
@Override
public void onDestroyView() {
categoriesFilter.removeTextChangedListener(textWatcher);
super.onDestroyView();
}
public void backButtonDialog() { public void backButtonDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
@ -581,8 +565,27 @@ public class CategorizationFragment extends Fragment {
} }
@Override @Override
public void onAttach(Activity activity) { public void onActivityCreated(Bundle savedInstanceState) {
super.onAttach(activity); super.onActivityCreated(savedInstanceState);
onCategoriesSaveHandler = (OnCategoriesSaveHandler) activity; 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 GridView photosGrid;
private PhotoDisplayAdapter photosAdapter; private PhotoDisplayAdapter photosAdapter;
private EditText baseTitle; private EditText baseTitle;
private TitleTextWatcher textWatcher = new TitleTextWatcher();
private Point photoSize; private Point photoSize;
private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
@ -88,7 +89,6 @@ public class MultipleUploadListFragment extends Fragment {
holder = (UploadHolderView)view.getTag(); holder = (UploadHolderView)view.getTag();
} }
Contribution up = (Contribution)this.getItem(i); Contribution up = (Contribution)this.getItem(i);
if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) { if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) {
@ -161,37 +161,16 @@ public class MultipleUploadListFragment extends Fragment {
photoSize = calculatePicDimension(detailProvider.getTotalMediaCount()); photoSize = calculatePicDimension(detailProvider.getTotalMediaCount());
photosGrid.setColumnWidth(photoSize.x); photosGrid.setColumnWidth(photoSize.x);
baseTitle.addTextChangedListener(new TextWatcher() { baseTitle.addTextChangedListener(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) {
}
});
return view; return view;
} }
@Override
public void onDestroyView() {
baseTitle.removeTextChangedListener(textWatcher);
super.onDestroyView();
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);
@ -219,4 +198,29 @@ public class MultipleUploadListFragment extends Fragment {
setHasOptionsMenu(true); 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; package fr.free.nrw.commons.upload;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -53,6 +52,7 @@ public class SingleUploadFragment extends Fragment {
@BindView(R.id.licenseSpinner) Spinner licenseSpinner; @BindView(R.id.licenseSpinner) Spinner licenseSpinner;
private OnUploadActionInitiated uploadActionInitiatedHandler; private OnUploadActionInitiated uploadActionInitiatedHandler;
private TitleTextWatcher textWatcher = new TitleTextWatcher();
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 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))); Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license)));
licenseSpinner.setSelection(position); licenseSpinner.setSelection(position);
TextWatcher uploadEnabler = new TextWatcher() { titleEdit.addTextChangedListener(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);
setLicenseSummary(license); setLicenseSummary(license);
return rootView; 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) { @OnItemSelected(R.id.licenseSpinner) void onLicenseSelected(AdapterView<?> parent, View view, int position, long id) {
String licenseName = parent.getItemAtPosition(position).toString(); String licenseName = parent.getItemAtPosition(position).toString();
@ -206,9 +197,10 @@ public class SingleUploadFragment extends Fragment {
} }
@Override @Override
public void onAttach(Activity activity) { public void onActivityCreated(Bundle savedInstanceState) {
super.onAttach(activity); super.onActivityCreated(savedInstanceState);
uploadActionInitiatedHandler = (OnUploadActionInitiated) activity; setHasOptionsMenu(true);
uploadActionInitiatedHandler = (OnUploadActionInitiated) getActivity();
} }
@Override @Override
@ -223,9 +215,18 @@ public class SingleUploadFragment extends Fragment {
} }
} }
@Override private class TitleTextWatcher implements TextWatcher {
public void onCreate(Bundle savedInstanceState) { @Override
super.onCreate(savedInstanceState); public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
setHasOptionsMenu(true);
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
@Override
public void afterTextChanged(Editable editable) {
if(getActivity() != null) {
getActivity().invalidateOptionsMenu();
}
}
} }
} }