Skip to content

Commit 602de84

Browse files
committed
Closes mozilla-mobile#1939. Use Material Design errors for Add Search Engine.
1 parent 9b928b8 commit 602de84

File tree

5 files changed

+109
-26
lines changed

5 files changed

+109
-26
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
<activity android:name=".activity.SettingsActivity"
8282
android:theme="@style/SettingsTheme"
8383
android:configChanges="locale"
84-
android:windowSoftInputMode="adjustResize" />
84+
android:windowSoftInputMode="adjustPan"/>
8585

8686
<activity android:name=".activity.InfoActivity"
8787
android:theme="@style/InfoTheme"/>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
package org.mozilla.focus.search;
6+
7+
import android.content.Context;
8+
import android.content.SharedPreferences;
9+
import android.preference.Preference;
10+
import android.support.design.widget.TextInputLayout;
11+
import android.text.Editable;
12+
import android.text.TextUtils;
13+
import android.text.TextWatcher;
14+
import android.util.AttributeSet;
15+
import android.view.View;
16+
import android.view.ViewGroup;
17+
import android.widget.EditText;
18+
19+
import org.mozilla.focus.R;
20+
import org.mozilla.focus.utils.UrlUtils;
21+
22+
public class ManualAddSearchEnginePreference extends Preference {
23+
private EditText engineNameEditText;
24+
private EditText searchQueryEditText;
25+
private TextInputLayout engineNameErrorLayout;
26+
private TextInputLayout searchQueryErrorLayout;
27+
28+
public ManualAddSearchEnginePreference(Context context, AttributeSet attrs) {
29+
super(context, attrs);
30+
}
31+
32+
public ManualAddSearchEnginePreference(Context context, AttributeSet attrs, int defStyleAttr) {
33+
super(context, attrs, defStyleAttr);
34+
}
35+
36+
@Override
37+
protected View onCreateView(ViewGroup parent) {
38+
final View view = super.onCreateView(parent);
39+
40+
engineNameErrorLayout = view.findViewById(R.id.edit_engine_name_layout);
41+
searchQueryErrorLayout = view.findViewById(R.id.edit_search_string_layout);
42+
43+
engineNameEditText = view.findViewById(R.id.edit_engine_name);
44+
engineNameEditText.addTextChangedListener(buildTextWatcherForErrorLayout(engineNameErrorLayout));
45+
searchQueryEditText = view.findViewById(R.id.edit_search_string);
46+
searchQueryEditText.addTextChangedListener(buildTextWatcherForErrorLayout(searchQueryErrorLayout));
47+
return view;
48+
}
49+
50+
private boolean engineNameIsUnique(String engineName) {
51+
final SharedPreferences sharedPreferences = getContext().getSharedPreferences(SearchEngineManager.PREF_FILE_SEARCH_ENGINES, Context.MODE_PRIVATE);
52+
return !sharedPreferences.contains(engineName);
53+
}
54+
55+
public boolean validateEngineNameAndShowError(String engineName) {
56+
if (TextUtils.isEmpty(engineName) || !engineNameIsUnique(engineName)) {
57+
engineNameErrorLayout.setError(getContext().getString(R.string.search_add_error_empty_name));
58+
return false;
59+
} else {
60+
engineNameErrorLayout.setError(null);
61+
return true;
62+
}
63+
}
64+
65+
public boolean validateSearchQueryAndShowError(String searchQuery) {
66+
if (TextUtils.isEmpty(searchQuery)) {
67+
searchQueryErrorLayout.setError(getContext().getString(R.string.search_add_error_empty_search));
68+
return false;
69+
} else if (!UrlUtils.isValidSearchQueryUrl(searchQuery)) {
70+
searchQueryErrorLayout.setError(getContext().getString(R.string.search_add_error_format));
71+
return false;
72+
} else {
73+
searchQueryErrorLayout.setError(null);
74+
return true;
75+
}
76+
}
77+
78+
private TextWatcher buildTextWatcherForErrorLayout(final TextInputLayout errorLayout) {
79+
return new TextWatcher() {
80+
@Override
81+
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
82+
83+
@Override
84+
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
85+
errorLayout.setError(null);
86+
}
87+
88+
@Override
89+
public void afterTextChanged(Editable editable) {}
90+
};
91+
}
92+
}

app/src/main/java/org/mozilla/focus/settings/ManualAddSearchEngineSettingsFragment.java

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,16 @@
88
import android.os.Bundle;
99
import android.support.annotation.Nullable;
1010
import android.support.design.widget.Snackbar;
11-
import android.text.TextUtils;
1211
import android.view.Menu;
1312
import android.view.MenuInflater;
1413
import android.view.MenuItem;
1514
import android.view.View;
1615
import android.widget.EditText;
1716

1817
import org.mozilla.focus.R;
18+
import org.mozilla.focus.search.ManualAddSearchEnginePreference;
1919
import org.mozilla.focus.search.SearchEngineManager;
2020
import org.mozilla.focus.telemetry.TelemetryWrapper;
21-
import org.mozilla.focus.utils.UrlUtils;
22-
23-
import java.util.Collections;
2421

2522
public class ManualAddSearchEngineSettingsFragment extends SettingsFragment {
2623
@Override
@@ -50,17 +47,14 @@ public boolean onOptionsItemSelected(MenuItem item) {
5047
final String engineName = ((EditText) rootView.findViewById(R.id.edit_engine_name)).getText().toString();
5148
final String searchQuery = ((EditText) rootView.findViewById(R.id.edit_search_string)).getText().toString();
5249

53-
final SharedPreferences sharedPreferences = getSearchEngineSharedPreferences();
54-
boolean isSuccess = false;
55-
if (TextUtils.isEmpty(engineName)) {
56-
Snackbar.make(rootView, R.string.search_add_error_empty_name, Snackbar.LENGTH_SHORT).show();
57-
} else if (TextUtils.isEmpty(searchQuery)) {
58-
Snackbar.make(rootView, R.string.search_add_error_empty_search, Snackbar.LENGTH_SHORT).show();
59-
} else if (!validateSearchFields(engineName, searchQuery, sharedPreferences)) {
60-
Snackbar.make(rootView, R.string.search_add_error_format, Snackbar.LENGTH_SHORT).show();
61-
} else {
50+
final ManualAddSearchEnginePreference pref = (ManualAddSearchEnginePreference) findPreference(getString(R.string.pref_key_manual_add_search_engine));
51+
final boolean engineValid = pref.validateEngineNameAndShowError(engineName);
52+
final boolean searchValid = pref.validateSearchQueryAndShowError(searchQuery);
53+
54+
final boolean isSuccess = engineValid && searchValid;
55+
if (isSuccess) {
56+
final SharedPreferences sharedPreferences = getSearchEngineSharedPreferences();
6257
SearchEngineManager.addSearchEngine(sharedPreferences, getActivity(), engineName, searchQuery);
63-
isSuccess = true;
6458
Snackbar.make(rootView, R.string.search_add_confirmation, Snackbar.LENGTH_SHORT).show();
6559
getFragmentManager().popBackStack();
6660
}
@@ -70,13 +64,4 @@ public boolean onOptionsItemSelected(MenuItem item) {
7064
return super.onOptionsItemSelected(item);
7165
}
7266
}
73-
74-
private static boolean validateSearchFields(String engineName, String searchString, SharedPreferences sharedPreferences) {
75-
if (sharedPreferences.getStringSet(SearchEngineManager.PREF_KEY_CUSTOM_SEARCH_ENGINES,
76-
Collections.<String>emptySet()).contains(engineName)) {
77-
return false;
78-
}
79-
80-
return UrlUtils.isValidSearchQueryUrl(searchString);
81-
}
8267
}

app/src/main/res/layout/preference_manual_add_search_engine.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,21 @@
1414
android:importantForAutofill="noExcludeDescendants">
1515

1616
<android.support.design.widget.TextInputLayout
17+
android:id="@+id/edit_engine_name_layout"
1718
android:layout_width="match_parent"
1819
android:layout_height="wrap_content">
1920
<android.support.design.widget.TextInputEditText
2021
android:id="@+id/edit_engine_name"
2122
android:layout_width="match_parent"
2223
android:layout_height="wrap_content"
2324
android:hint="@string/search_add_manually_name_hint"
24-
android:inputType="text" />
25+
android:inputType="text">
26+
<requestFocus/>
27+
</android.support.design.widget.TextInputEditText>
2528
</android.support.design.widget.TextInputLayout>
2629

2730
<android.support.design.widget.TextInputLayout
31+
android:id="@+id/edit_search_string_layout"
2832
android:layout_width="match_parent"
2933
android:layout_height="wrap_content">
3034
<android.support.design.widget.TextInputEditText

app/src/main/res/xml/manual_add_search_engine.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
55

66
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
7-
<Preference android:layout="@layout/preference_manual_add_search_engine"/>
7+
<org.mozilla.focus.search.ManualAddSearchEnginePreference
8+
android:key="@string/pref_key_manual_add_search_engine"
9+
android:layout="@layout/preference_manual_add_search_engine"/>
810
</PreferenceScreen>

0 commit comments

Comments
 (0)