private void init() {

        // don't populate if already populated
        if (binding.gridLayout.getChildCount() > 0) {
            return;
        }

        final CardView geocodeCard = addSearchCardWithField(R.string.search_geo, R.drawable.search_identifier, R.string.pref_search_history_geocode, this::findByGeocodeFn, DataStore::getSuggestionsGeocode, GeocacheAutoCompleteAdapter::getLastOpenedCachesArray, new InputFilter.AllCaps());
        geocodeCard.setOnLongClickListener(v -> {
            final String geocode = getGeocodeFromClipboard();
            if (null != geocode) {
                findByGeocodeFn(geocode);
                return true;
            }
            return false;
        });

        final SearchCardView kwCard = addSearchCardWithField(R.string.search_kw, R.drawable.search_keyword, null, this::findByKeywordFn, DataStore::getSuggestionsKeyword, () -> Settings.getHistoryList(R.string.pref_search_history_keyword), null);
        // mitigation for #13312
        if (!Settings.isGCPremiumMember()) {
            final int activeCount = ConnectorFactory.getActiveConnectors().size();
            if (GCConnector.getInstance().isActive() && (activeCount == 1 || (activeCount == 2 && ALConnector.getInstance().isActive()))) {
                // only gc.com connectors active, and user has basic member status => disable keyword search
                kwCard.addOnClickListener(() -> SimpleDialog.of(this).setMessage(TextParam.id(R.string.search_kw_disabled_hint)).show());
                ((ImageView) kwCard.findViewById(R.id.icon)).getDrawable().setTint(getResources().getColor(R.color.colorTextHint));
            }
        }

        addSearchCard(R.string.search_coordinates, R.drawable.ic_menu_mylocation)
                .addOnClickListener(this::onClickCoordinates);

        addSearchCardWithField(R.string.search_address, R.drawable.ic_menu_home, R.string.pref_search_history_address, this::findByAddressFn, null, () -> Settings.getHistoryList(R.string.pref_search_history_address), null);

        addSearchCardWithField(R.string.search_hbu, R.drawable.search_owner, null, this::findByOwnerFn, DataStore::getSuggestionsOwnerName, () -> Settings.getHistoryList(R.string.pref_search_history_owner), null);

        addSearchCardWithField(R.string.search_finder, R.drawable.search_finder, null, this::findByFinderFn, DataStore::getSuggestionsFinderName, () -> Settings.getHistoryList(R.string.pref_search_history_finder), null);

        addSearchCard(R.string.search_filter, R.drawable.ic_menu_filter)
                .addOnClickListener(() -> GeocacheFilterActivity.selectFilter(this, new GeocacheFilterContext(GeocacheFilterContext.FilterType.LIVE), null, false))
                .addOnLongClickListener(() -> SimpleDialog.of(this).setMessage(TextParam.id(R.string.search_filter_info_message).setMarkdown(true)).show());

        addSearchCardWithField(R.string.search_tb, R.drawable.trackable_all, null, this::findTrackableFn, DataStore::getSuggestionsTrackableCode, () -> Settings.getHistoryList(R.string.pref_search_history_trackable), new InputFilter.AllCaps());

        addSearchCard(R.string.search_own_caches, R.drawable.ic_menu_owned)
                .addOnClickListener(() -> findByOwnerFn(Settings.getUserName()));

        addSearchCard(R.string.caches_history, R.drawable.ic_menu_recent_history)
                .addOnClickListener(() -> startActivity(CacheListActivity.getHistoryIntent(this)));
    }
try to interpret query as trackable

@param query         Trimmed string to search for
@param keywordSearch Set to true if keyword search should be performed if query isn't GC or TB
@return true if trackable was found
main/src/main/java/cgeo/geocaching/SearchActivity.java