Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9869df6 authored by Stefan Niedermann's avatar Stefan Niedermann
Browse files

Fix #1032 Save page title when sharing from browser

parent 2b530bdb
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
@@ -9,8 +9,9 @@ import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;

import it.niedermann.owncloud.notes.shared.model.DBNote;
import it.niedermann.owncloud.notes.main.MainActivity;
import it.niedermann.owncloud.notes.shared.model.DBNote;
import it.niedermann.owncloud.notes.shared.util.ShareUtil;

public class AppendToNoteActivity extends MainActivity {

@@ -22,8 +23,7 @@ public class AppendToNoteActivity extends MainActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Intent receivedIntent = getIntent();
        receivedText = receivedIntent.getStringExtra(Intent.EXTRA_TEXT);
        receivedText = ShareUtil.extractSharedText(getIntent());
        @Nullable final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            getSupportActionBar().setTitle(R.string.append_to_note);
@@ -35,7 +35,7 @@ public class AppendToNoteActivity extends MainActivity {

    @Override
    public void onNoteClick(int position, View v) {
        if (receivedText != null && receivedText.length() > 0) {
        if (!TextUtils.isEmpty(receivedText)) {
            final DBNote note = db.getNote(localAccount.getId(), ((DBNote) adapter.getItem(position)).getId());
            final String oldContent = note.getContent();
            String newContent;
+6 −2
Original line number Diff line number Diff line
@@ -15,19 +15,23 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Calendar;
import java.util.Objects;

import it.niedermann.android.markdown.MarkdownUtil;
import it.niedermann.owncloud.notes.LockedActivity;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.databinding.ActivityEditBinding;
import it.niedermann.owncloud.notes.accountpicker.AccountPickerListener;
import it.niedermann.owncloud.notes.databinding.ActivityEditBinding;
import it.niedermann.owncloud.notes.main.MainActivity;
import it.niedermann.owncloud.notes.shared.model.Category;
import it.niedermann.owncloud.notes.shared.model.CloudNote;
import it.niedermann.owncloud.notes.shared.model.DBNote;
import it.niedermann.owncloud.notes.shared.model.LocalAccount;
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
import it.niedermann.owncloud.notes.shared.util.ShareUtil;

public class EditNoteActivity extends LockedActivity implements BaseNoteFragment.NoteFragmentListener, AccountPickerListener {

@@ -170,7 +174,7 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment
                        (Intent.ACTION_SEND.equals(intent.getAction()) ||
                                INTENT_GOOGLE_ASSISTANT.equals(intent.getAction()))
        ) {
            content = intent.getStringExtra(Intent.EXTRA_TEXT);
            content = ShareUtil.extractSharedText(intent);
        } else if (intent.hasExtra(PARAM_CONTENT)) {
            content = intent.getStringExtra(PARAM_CONTENT);
        }
+0 −132
Original line number Diff line number Diff line
/*
 * Nextcloud Notes application
 *
 * @author Mario Danic
 * Copyright (C) 2018 Mario Danic <mario@lovelyhq.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package it.niedermann.owncloud.notes.shared.util;

import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.MetricAffectingSpan;

import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import it.niedermann.android.util.ColorUtil;
import it.niedermann.owncloud.notes.NotesApplication;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.branding.BrandingUtil;

public class DisplayUtils {

    private DisplayUtils() {

    }

    public static Spannable searchAndColor(Spannable spannable, CharSequence searchText, @NonNull Context context, @Nullable Integer current, @ColorInt int mainColor, @ColorInt int textColor) {
        CharSequence text = spannable.toString();

        Object[] spansToRemove = spannable.getSpans(0, text.length(), Object.class);
        for (Object span : spansToRemove) {
            if (span instanceof SearchSpan)
                spannable.removeSpan(span);
        }

        if (TextUtils.isEmpty(text) || TextUtils.isEmpty(searchText)) {
            return spannable;
        }

        Matcher m = Pattern.compile(searchText.toString(), Pattern.CASE_INSENSITIVE | Pattern.LITERAL)
                .matcher(text);

        int i = 1;
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            spannable.setSpan(new SearchSpan(context, mainColor, textColor, (current != null && i == current)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            i++;
        }

        return spannable;
    }


    static class SearchSpan extends MetricAffectingSpan {

        private final boolean current;
        @NonNull
        Context context;
        @ColorInt
        private final int mainColor;
        @ColorInt
        private final int textColor;
        @ColorInt
        private final int highlightColor;

        SearchSpan(@NonNull Context context, @ColorInt int mainColor, @ColorInt int textColor, boolean current) {
            this.context = context;
            this.mainColor = mainColor;
            this.textColor = textColor;
            this.current = current;
            this.highlightColor = ContextCompat.getColor(context, R.color.bg_highlighted);
        }

        @Override
        public void updateDrawState(TextPaint tp) {
            if (current) {
                if (NotesApplication.isDarkThemeActive(context)) {
                    if (ColorUtil.INSTANCE.isColorDark(mainColor)) {
                        tp.bgColor = Color.WHITE;
                        tp.setColor(mainColor);
                    } else {
                        tp.bgColor = mainColor;
                        tp.setColor(Color.BLACK);
                    }
                } else {
                    if (ColorUtil.INSTANCE.isColorDark(mainColor)) {
                        tp.bgColor = mainColor;
                        tp.setColor(Color.WHITE);
                    } else {
                        if (NotesColorUtil.contrastRatioIsSufficient(mainColor, highlightColor)) {
                            tp.bgColor = highlightColor;
                        } else {
                            tp.bgColor = Color.BLACK;
                        }
                        tp.setColor(mainColor);
                    }
                }
            } else {
                tp.bgColor = highlightColor;
                tp.setColor(BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor));
            }
            tp.setFakeBoldText(true);
        }

        @Override
        public void updateMeasureState(@NonNull TextPaint tp) {
            tp.setFakeBoldText(true);
        }
    }
}
+28 −0
Original line number Diff line number Diff line
@@ -6,6 +6,11 @@ import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.net.MalformedURLException;
import java.net.URL;

import it.niedermann.android.markdown.MarkdownUtil;

import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN;

public class ShareUtil {
@@ -17,4 +22,27 @@ public class ShareUtil {
                .putExtra(Intent.EXTRA_TITLE, subject)
                .putExtra(Intent.EXTRA_TEXT, text), subject));
    }

    public static String extractSharedText(@NonNull Intent intent) {
        final String text = intent.getStringExtra(Intent.EXTRA_TEXT);
        if (intent.hasExtra(Intent.EXTRA_SUBJECT)) {
            final String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
            try {
                new URL(text);
                if (text != null && subject != null && !subject.trim().isEmpty()) {
                    return MarkdownUtil.getMarkdownLink(subject, text);
                } else {
                    return text;
                }
            } catch (MalformedURLException e) {
                if (subject != null && !subject.trim().isEmpty()) {
                    return subject + ": " + text;
                } else {
                    return text;
                }
            }
        } else {
            return text;
        }
    }
}
+6 −2
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.noties.markwon.Markwon;
import it.niedermann.android.markdown.model.SearchSpan;
import it.niedermann.android.markdown.model.EListType;
import it.niedermann.android.markdown.model.SearchSpan;

public class MarkdownUtil {

@@ -337,4 +337,8 @@ public class MarkdownUtil {
            return spannableContent;
        }
    }

    public static String getMarkdownLink(@NonNull String text, @NonNull String url) {
        return "[" + text + "](" + url + ")";
    }
}