@Override
        // splitting up that method would not help improve readability
        @SuppressWarnings({"PMD.NPathComplexity", "PMD.ExcessiveMethodLength"})
        public void setContent() {
            // retrieve activity and cache - if either of them is null, something's really wrong!
            final CacheDetailActivity activity = (CacheDetailActivity) getActivity();
            if (activity == null) {
                return;
            }
            cache = activity.getCache();
            if (cache == null) {
                return;
            }
            binding.getRoot().setVisibility(View.VISIBLE);

            // load description
            reloadDescription(this.getActivity(), cache, true, 0, activity.descriptionStyle, null, null, null);

            //check for geochecker
            final String checkerUrl = CheckerUtils.getCheckerUrl(cache);
            binding.descriptionChecker.setVisibility(checkerUrl == null ? View.GONE : View.VISIBLE);
            if (checkerUrl != null) {
                binding.descriptionChecker.setOnClickListener(v -> openGeochecker(activity, cache));
                binding.descriptionCheckerButton.setOnClickListener(v -> openGeochecker(activity, cache));
            }

            // extra description
            final String geocode = cache.getGeocode();
            boolean hasExtraDescription = ALConnector.getInstance().canHandle(geocode); // could be generalized, but currently it's only AL
            if (hasExtraDescription) {
                final IConnector conn = ConnectorFactory.getConnector(geocode);
                if (conn != null) {
                    binding.extraDescriptionTitle.setText(conn.getName());
                    binding.extraDescription.setText(conn.getExtraDescription());
                } else {
                    hasExtraDescription = false;
                }
            }
            binding.extraDescriptionBox.setVisibility(hasExtraDescription ? View.VISIBLE : View.GONE);

            // cache personal note
            setPersonalNote(binding.personalnote, binding.personalnoteButtonSeparator, cache.getPersonalNote());
            binding.personalnote.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
            CacheDetailsCreator.addShareAction(activity, binding.personalnote);
            TooltipCompat.setTooltipText(binding.editPersonalnote, getString(R.string.cache_personal_note_edit));
            binding.editPersonalnote.setOnClickListener(v -> editPersonalNote(cache, activity));
            binding.personalnote.setOnClickListener(v -> editPersonalNote(cache, activity));
            TooltipCompat.setTooltipText(binding.storewaypointsPersonalnote, getString(R.string.cache_personal_note_storewaypoints));
            binding.storewaypointsPersonalnote.setOnClickListener(v -> {
                activity.ensureSaved();
                activity.storeWaypointsInPersonalNote(cache);
            });
            TooltipCompat.setTooltipText(binding.deleteewaypointsPersonalnote, getString(R.string.cache_personal_note_removewaypoints));
            binding.deleteewaypointsPersonalnote.setOnClickListener(v -> {
                activity.ensureSaved();
                activity.removeWaypointsFromPersonalNote(cache);
            });
            binding.personalnoteVarsOutOfSync.setOnClickListener(v -> handleVariableOutOfSync());
            activity.adjustPersonalNoteVarsOutOfSyncButton(binding.personalnoteVarsOutOfSync);
            final PersonalNoteCapability connector = ConnectorFactory.getConnectorAs(cache, PersonalNoteCapability.class);
            if (connector != null && connector.canAddPersonalNote(cache)) {
                binding.uploadPersonalnote.setVisibility(View.VISIBLE);
                TooltipCompat.setTooltipText(binding.uploadPersonalnote, getString(R.string.cache_personal_note_upload));
                binding.uploadPersonalnote.setOnClickListener(v -> activity.checkAndUploadPersonalNote(connector));
            } else {
                binding.uploadPersonalnote.setVisibility(View.GONE);
            }

            final List<Image> spoilerImages = cache.getFilteredSpoilers();
            final boolean hasSpoilerImages = CollectionUtils.isNotEmpty(spoilerImages);
            // cache hint and spoiler images
            if (StringUtils.isNotBlank(cache.getHint()) || hasSpoilerImages) {
                binding.hintBox.setVisibility(View.VISIBLE);
            } else {
                binding.hintBox.setVisibility(View.GONE);
            }

            if (StringUtils.isNotBlank(cache.getHint())) {
                if (TextUtils.containsHtml(cache.getHint())) {
                    binding.hint.setText(HtmlCompat.fromHtml(cache.getHint(), HtmlCompat.FROM_HTML_MODE_LEGACY, new HtmlImage(cache.getGeocode(), false, false, false), null), TextView.BufferType.SPANNABLE);
                } else {
                    binding.hint.setText(cache.getHint());
                }
                binding.hint.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
                binding.hint.setVisibility(View.VISIBLE);
                if (Settings.getHintAsRot13()) {
                    binding.hint.setText(CryptUtils.rot13((Spannable) binding.hint.getText()));
                }
                final DecryptTextClickListener decryptListener = new DecryptTextClickListener(binding.hint);
                binding.hint.setOnClickListener(decryptListener);
                binding.hint.setClickable(true);
                binding.hintBox.setOnClickListener(decryptListener);
                binding.hintBox.setClickable(true);
            } else {
                binding.hint.setVisibility(View.GONE);
                binding.hint.setClickable(false);
                binding.hint.setOnClickListener(null);
                binding.hintBox.setClickable(false);
                binding.hintBox.setOnClickListener(null);
            }


            if (hasSpoilerImages) {
                binding.hintSpoilerlink.setVisibility(View.VISIBLE);
                binding.hintSpoilerlink.setClickable(true);
                binding.hintSpoilerlink.setOnClickListener(arg0 -> {
                    final List<Image> sis = cache.getFilteredSpoilers();
                    if (cache == null || sis.isEmpty()) {
                        activity.showToast(getString(R.string.err_detail_no_spoiler));
                        return;
                    }
                    ImageGalleryActivity.startActivity(activity, cache.getGeocode(), sis);
                });

                // if there is only a listing background image without other additional pictures, change the text to better explain the content.
                if (spoilerImages.size() == 1 && getString(R.string.cache_image_background).equals(spoilerImages.get(0).title)) {
                    binding.hintSpoilerlink.setText(R.string.cache_image_background);
                } else {
                    binding.hintSpoilerlink.setText(R.string.cache_menu_spoilers);
                }
            } else {
                binding.hintSpoilerlink.setVisibility(View.GONE);
                binding.hintSpoilerlink.setClickable(true);
                binding.hintSpoilerlink.setOnClickListener(null);
            }

            //register for changes of variableslist -> state of variable sync may change
            cache.getVariables().addChangeListener(this, s -> activity.adjustPersonalNoteVarsOutOfSyncButton(binding.personalnoteVarsOutOfSync));

            final OfflineTranslateUtils.Status currentTranslationStatus = activity.translationStatus;
            if (currentTranslationStatus.checkRetranslation()) {
                currentTranslationStatus.setNotTranslated();
                translateListing();
            }
        }
Show/hide buttons, set text in favorite line and box
main/src/main/java/cgeo/geocaching/CacheDetailActivity.java