Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java |
index 32572c755c204231e5e83f25e03dfedae523ddf4..38881c2fcdc3a9036267a0268eadd24a39c7f0ab 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java |
@@ -36,7 +36,6 @@ import org.chromium.chrome.browser.preferences.website.GeolocationInfo; |
import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences; |
import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge; |
import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
-import org.chromium.chrome.browser.search_engines.TemplateUrlService.LoadListener; |
import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl; |
import org.chromium.components.location.LocationUtils; |
import org.chromium.ui.text.SpanApplier; |
@@ -48,7 +47,9 @@ import java.util.List; |
/** |
* A custom adapter for listing search engines. |
*/ |
-public class SearchEngineAdapter extends BaseAdapter implements LoadListener, OnClickListener { |
+public class SearchEngineAdapter extends BaseAdapter |
+ implements TemplateUrlService.LoadListener, TemplateUrlService.TemplateUrlServiceObserver, |
+ OnClickListener { |
private static final int VIEW_TYPE_ITEM = 0; |
private static final int VIEW_TYPE_DIVIDER = 1; |
private static final int VIEW_TYPE_COUNT = 2; |
@@ -75,6 +76,8 @@ public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On |
/** The position of the default search engine before user's action. */ |
private int mInitialEnginePosition = -1; |
+ private boolean mHasLoadObserver; |
+ |
/** |
* Construct a SearchEngineAdapter. |
* @param context The current context. |
@@ -83,8 +86,25 @@ public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On |
mContext = context; |
mLayoutInflater = (LayoutInflater) mContext.getSystemService( |
Context.LAYOUT_INFLATER_SERVICE); |
+ } |
- initEntries(); |
+ /** |
+ * Start the adapter to gather the available search engines and listen for updates. |
+ */ |
+ public void start() { |
+ refreshData(); |
+ TemplateUrlService.getInstance().addObserver(this); |
+ } |
+ |
+ /** |
+ * Stop the adapter from listening for future search engine updates. |
+ */ |
+ public void stop() { |
+ if (mHasLoadObserver) { |
+ TemplateUrlService.getInstance().unregisterLoadListener(this); |
+ mHasLoadObserver = false; |
+ } |
+ TemplateUrlService.getInstance().removeObserver(this); |
} |
@VisibleForTesting |
@@ -102,26 +122,49 @@ public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On |
return toKeyword(index); |
} |
+ private void initializeSearchEngineGroups(List<TemplateUrl> templateUrls) { |
+ mPrepopulatedSearchEngines = new ArrayList<>(); |
+ mRecentSearchEngines = new ArrayList<>(); |
+ |
+ for (int i = 0; i < templateUrls.size(); i++) { |
+ TemplateUrl templateUrl = templateUrls.get(i); |
+ if (templateUrl.getType() == TemplateUrlService.TYPE_PREPOPULATED |
+ || templateUrl.getType() == TemplateUrlService.TYPE_DEFAULT) { |
+ mPrepopulatedSearchEngines.add(templateUrl); |
+ } else { |
+ mRecentSearchEngines.add(templateUrl); |
+ } |
+ } |
+ } |
+ |
/** |
* Initialize the search engine list. |
*/ |
- private void initEntries() { |
+ private void refreshData() { |
TemplateUrlService templateUrlService = TemplateUrlService.getInstance(); |
if (!templateUrlService.isLoaded()) { |
+ mHasLoadObserver = true; |
templateUrlService.registerLoadListener(this); |
templateUrlService.load(); |
return; // Flow continues in onTemplateUrlServiceLoaded below. |
} |
- int defaultSearchEngineIndex = templateUrlService.getDefaultSearchEngineIndex(); |
- for (TemplateUrl templateUrl : templateUrlService.getSearchEngines()) { |
- if (templateUrl.getType() == TemplateUrlService.TYPE_PREPOPULATED |
- || templateUrl.getType() == TemplateUrlService.TYPE_DEFAULT) { |
- mPrepopulatedSearchEngines.add(templateUrl); |
- } else { |
- mRecentSearchEngines.add(templateUrl); |
+ List<TemplateUrl> templateUrls = templateUrlService.getSearchEngines(); |
+ boolean searchEnginesChanged = templateUrls.size() |
+ != mPrepopulatedSearchEngines.size() + mRecentSearchEngines.size(); |
+ if (!searchEnginesChanged) { |
+ for (int i = 0; i < templateUrls.size(); i++) { |
+ TemplateUrl templateUrl = templateUrls.get(i); |
+ if (!mPrepopulatedSearchEngines.contains(templateUrl) |
+ && !mRecentSearchEngines.contains(templateUrl)) { |
+ searchEnginesChanged = true; |
+ break; |
+ } |
} |
} |
+ if (searchEnginesChanged) initializeSearchEngineGroups(templateUrls); |
+ |
+ int defaultSearchEngineIndex = templateUrlService.getDefaultSearchEngineIndex(); |
// Convert the TemplateUrl index into an index of mSearchEngines. |
mSelectedSearchEnginePosition = -1; |
@@ -138,9 +181,14 @@ public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On |
} |
} |
+ if (mSelectedSearchEnginePosition == -1) { |
+ throw new IllegalStateException( |
+ "Default search engine index did not match any available search engines."); |
+ } |
+ |
mInitialEnginePosition = mSelectedSearchEnginePosition; |
- TemplateUrlService.getInstance().setSearchEngine(toKeyword(mSelectedSearchEnginePosition)); |
+ notifyDataSetChanged(); |
} |
private String toKeyword(int position) { |
@@ -295,8 +343,13 @@ public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On |
@Override |
public void onTemplateUrlServiceLoaded() { |
TemplateUrlService.getInstance().unregisterLoadListener(this); |
- initEntries(); |
- notifyDataSetChanged(); |
+ mHasLoadObserver = false; |
+ refreshData(); |
+ } |
+ |
+ @Override |
+ public void onTemplateURLServiceChanged() { |
+ refreshData(); |
} |
// OnClickListener: |