Skip to content

Commit 94e0e5e

Browse files
committed
Always remove TextWatcher when finished with it.
1 parent 40c1ea3 commit 94e0e5e

File tree

4 files changed

+113
-105
lines changed

4 files changed

+113
-105
lines changed

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ public class LoginActivity extends AccountAuthenticatorActivity {
3030

3131
private Button loginButton;
3232
private EditText usernameEdit;
33-
EditText passwordEdit;
34-
EditText twoFactorEdit;
33+
private EditText passwordEdit;
34+
private EditText twoFactorEdit;
3535
ProgressDialog progressDialog;
36+
private LoginTextWatcher textWatcher = new LoginTextWatcher();
3637

3738
private CommonsApplication app;
3839

@@ -53,10 +54,9 @@ public void onCreate(Bundle savedInstanceState) {
5354

5455
prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE);
5556

56-
TextWatcher loginEnabler = newLoginTextWatcher();
57-
usernameEdit.addTextChangedListener(loginEnabler);
58-
passwordEdit.addTextChangedListener(loginEnabler);
59-
twoFactorEdit.addTextChangedListener(loginEnabler);
57+
usernameEdit.addTextChangedListener(textWatcher);
58+
passwordEdit.addTextChangedListener(textWatcher);
59+
twoFactorEdit.addTextChangedListener(textWatcher);
6060
passwordEdit.setOnEditorActionListener( newLoginInputActionListener() );
6161

6262
loginButton.setOnClickListener(new View.OnClickListener() {
@@ -71,27 +71,24 @@ public void onClick(View v) {
7171
});
7272
}
7373

74-
private TextWatcher newLoginTextWatcher() {
75-
return new TextWatcher() {
76-
@Override
77-
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { }
74+
private class LoginTextWatcher implements TextWatcher {
75+
@Override
76+
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
77+
}
7878

79-
@Override
80-
public void onTextChanged(CharSequence charSequence, int start, int count, int after) { }
79+
@Override
80+
public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
81+
}
8182

82-
@Override
83-
public void afterTextChanged(Editable editable) {
84-
if(
85-
usernameEdit.getText().length() != 0 &&
86-
passwordEdit.getText().length() != 0 &&
87-
( BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE )
88-
) {
89-
loginButton.setEnabled(true);
90-
} else {
91-
loginButton.setEnabled(false);
92-
}
83+
@Override
84+
public void afterTextChanged(Editable editable) {
85+
if (usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0 &&
86+
(BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE)) {
87+
loginButton.setEnabled(true);
88+
} else {
89+
loginButton.setEnabled(false);
9390
}
94-
};
91+
}
9592
}
9693

9794
private TextView.OnEditorActionListener newLoginInputActionListener() {
@@ -138,6 +135,9 @@ protected void onDestroy() {
138135
} catch (Exception e) {
139136
e.printStackTrace();
140137
}
138+
usernameEdit.removeTextChangedListener(textWatcher);
139+
passwordEdit.removeTextChangedListener(textWatcher);
140+
twoFactorEdit.removeTextChangedListener(textWatcher);
141141
super.onDestroy();
142142
}
143143

app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.category;
22

3-
import android.app.Activity;
43
import android.content.ContentProviderClient;
54
import android.content.DialogInterface;
65
import android.content.SharedPreferences;
@@ -58,6 +57,7 @@ public interface OnCategoriesSaveHandler {
5857
ProgressBar categoriesSearchInProgress;
5958
TextView categoriesNotFoundView;
6059
TextView categoriesSkip;
60+
private CategoryTextWatcher textWatcher = new CategoryTextWatcher();
6161

6262
CategoriesAdapter categoriesAdapter;
6363
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
@@ -442,21 +442,7 @@ public void onItemClick(AdapterView<?> adapterView, View view, int index, long i
442442
}
443443
});
444444

445-
categoriesFilter.addTextChangedListener(new TextWatcher() {
446-
@Override
447-
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
448-
}
449-
450-
@Override
451-
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
452-
startUpdatingCategoryList();
453-
}
454-
455-
@Override
456-
public void afterTextChanged(Editable editable) {
457-
458-
}
459-
});
445+
categoriesFilter.addTextChangedListener(textWatcher);
460446

461447
startUpdatingCategoryList();
462448

@@ -469,14 +455,6 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
469455
inflater.inflate(R.menu.fragment_categorization, menu);
470456
}
471457

472-
@Override
473-
public void onCreate(Bundle savedInstanceState) {
474-
super.onCreate(savedInstanceState);
475-
setHasOptionsMenu(true);
476-
getActivity().setTitle(R.string.categories_activity_title);
477-
client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY);
478-
}
479-
480458
@Override
481459
public void onResume() {
482460
super.onResume();
@@ -498,6 +476,12 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
498476
}
499477
}
500478

479+
@Override
480+
public void onDestroyView() {
481+
categoriesFilter.removeTextChangedListener(textWatcher);
482+
super.onDestroyView();
483+
}
484+
501485
public void backButtonDialog() {
502486
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
503487

@@ -581,8 +565,27 @@ public void onClick(DialogInterface dialog, int id) {
581565
}
582566

583567
@Override
584-
public void onAttach(Activity activity) {
585-
super.onAttach(activity);
586-
onCategoriesSaveHandler = (OnCategoriesSaveHandler) activity;
568+
public void onActivityCreated(Bundle savedInstanceState) {
569+
super.onActivityCreated(savedInstanceState);
570+
setHasOptionsMenu(true);
571+
onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity();
572+
getActivity().setTitle(R.string.categories_activity_title);
573+
client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY);
574+
}
575+
576+
private class CategoryTextWatcher implements TextWatcher {
577+
@Override
578+
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
579+
}
580+
581+
@Override
582+
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
583+
startUpdatingCategoryList();
584+
}
585+
586+
@Override
587+
public void afterTextChanged(Editable editable) {
588+
589+
}
587590
}
588591
}

app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public interface OnMultipleUploadInitiatedHandler {
3939
private GridView photosGrid;
4040
private PhotoDisplayAdapter photosAdapter;
4141
private EditText baseTitle;
42+
private TitleTextWatcher textWatcher = new TitleTextWatcher();
4243

4344
private Point photoSize;
4445
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
@@ -88,7 +89,6 @@ public View getView(int i, View view, ViewGroup viewGroup) {
8889
holder = (UploadHolderView)view.getTag();
8990
}
9091

91-
9292
Contribution up = (Contribution)this.getItem(i);
9393

9494
if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) {
@@ -161,37 +161,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
161161
photoSize = calculatePicDimension(detailProvider.getTotalMediaCount());
162162
photosGrid.setColumnWidth(photoSize.x);
163163

164-
baseTitle.addTextChangedListener(new TextWatcher() {
165-
@Override
166-
public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
167-
168-
}
169-
170-
@Override
171-
public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
172-
for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) {
173-
Contribution up = (Contribution) detailProvider.getMediaAtPosition(i);
174-
Boolean isDirty = (Boolean)up.getTag("isDirty");
175-
if(isDirty == null || !isDirty) {
176-
if(!TextUtils.isEmpty(charSequence)) {
177-
up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1));
178-
} else {
179-
up.setFilename("");
180-
}
181-
}
182-
}
183-
detailProvider.notifyDatasetChanged();
184-
}
185-
186-
@Override
187-
public void afterTextChanged(Editable editable) {
188-
189-
}
190-
});
191-
164+
baseTitle.addTextChangedListener(textWatcher);
192165
return view;
193166
}
194167

168+
@Override
169+
public void onDestroyView() {
170+
baseTitle.removeTextChangedListener(textWatcher);
171+
super.onDestroyView();
172+
}
173+
195174
@Override
196175
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
197176
super.onCreateOptionsMenu(menu, inflater);
@@ -218,5 +197,30 @@ public void onCreate(Bundle savedInstanceState) {
218197

219198
setHasOptionsMenu(true);
220199
}
221-
200+
201+
private class TitleTextWatcher implements TextWatcher {
202+
@Override
203+
public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
204+
}
205+
206+
@Override
207+
public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
208+
for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) {
209+
Contribution up = (Contribution) detailProvider.getMediaAtPosition(i);
210+
Boolean isDirty = (Boolean)up.getTag("isDirty");
211+
if(isDirty == null || !isDirty) {
212+
if(!TextUtils.isEmpty(charSequence)) {
213+
up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1));
214+
} else {
215+
up.setFilename("");
216+
}
217+
}
218+
}
219+
detailProvider.notifyDatasetChanged();
220+
}
221+
222+
@Override
223+
public void afterTextChanged(Editable editable) {
224+
}
225+
}
222226
}

app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.upload;
22

3-
import android.app.Activity;
43
import android.content.Context;
54
import android.content.Intent;
65
import android.content.SharedPreferences;
@@ -53,6 +52,7 @@ public interface OnUploadActionInitiated {
5352
@BindView(R.id.licenseSpinner) Spinner licenseSpinner;
5453

5554
private OnUploadActionInitiated uploadActionInitiatedHandler;
55+
private TitleTextWatcher textWatcher = new TitleTextWatcher();
5656

5757
@Override
5858
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
@@ -125,28 +125,19 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
125125
Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license)));
126126
licenseSpinner.setSelection(position);
127127

128-
TextWatcher uploadEnabler = new TextWatcher() {
129-
@Override
130-
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
131-
132-
@Override
133-
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
134-
135-
@Override
136-
public void afterTextChanged(Editable editable) {
137-
if(getActivity() != null) {
138-
getActivity().invalidateOptionsMenu();
139-
}
140-
}
141-
};
142-
143-
titleEdit.addTextChangedListener(uploadEnabler);
128+
titleEdit.addTextChangedListener(textWatcher);
144129

145130
setLicenseSummary(license);
146131

147132
return rootView;
148133
}
149134

135+
@Override
136+
public void onDestroyView() {
137+
titleEdit.removeTextChangedListener(textWatcher);
138+
super.onDestroyView();
139+
}
140+
150141
@OnItemSelected(R.id.licenseSpinner) void onLicenseSelected(AdapterView<?> parent, View view, int position, long id) {
151142
String licenseName = parent.getItemAtPosition(position).toString();
152143

@@ -206,9 +197,10 @@ private void setLicenseSummary(String license) {
206197
}
207198

208199
@Override
209-
public void onAttach(Activity activity) {
210-
super.onAttach(activity);
211-
uploadActionInitiatedHandler = (OnUploadActionInitiated) activity;
200+
public void onActivityCreated(Bundle savedInstanceState) {
201+
super.onActivityCreated(savedInstanceState);
202+
setHasOptionsMenu(true);
203+
uploadActionInitiatedHandler = (OnUploadActionInitiated) getActivity();
212204
}
213205

214206
@Override
@@ -223,9 +215,18 @@ public void onStop() {
223215
}
224216
}
225217

226-
@Override
227-
public void onCreate(Bundle savedInstanceState) {
228-
super.onCreate(savedInstanceState);
229-
setHasOptionsMenu(true);
218+
private class TitleTextWatcher implements TextWatcher {
219+
@Override
220+
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
221+
222+
@Override
223+
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
224+
225+
@Override
226+
public void afterTextChanged(Editable editable) {
227+
if(getActivity() != null) {
228+
getActivity().invalidateOptionsMenu();
229+
}
230+
}
230231
}
231232
}

0 commit comments

Comments
 (0)