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

Commit e17329fa authored by stefan-niedermann's avatar stefan-niedermann
Browse files

Fix #567 Enable pinning notes as shortcut

parent 0ccc1d20
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -3,7 +3,11 @@ package it.niedermann.owncloud.notes.android.fragment;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
@@ -22,13 +26,18 @@ import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.ShareActionProvider;
import androidx.core.view.MenuItemCompat;
import androidx.core.view.ViewCompat;

import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.android.activity.EditNoteActivity;
import it.niedermann.owncloud.notes.model.CloudNote;
import it.niedermann.owncloud.notes.model.DBNote;
import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper;
import it.niedermann.owncloud.notes.util.DisplayUtils;
import it.niedermann.owncloud.notes.util.ICallback;

import static androidx.core.content.pm.ShortcutManagerCompat.isRequestPinShortcutSupported;
import static it.niedermann.owncloud.notes.android.activity.EditNoteActivity.ACTION_SHORTCUT;

public abstract class BaseNoteFragment extends Fragment implements CategoryDialogFragment.CategoryDialogListener {

    public interface NoteFragmentListener {
@@ -37,6 +46,7 @@ public abstract class BaseNoteFragment extends Fragment implements CategoryDialo
        void onNoteUpdated(DBNote note);
    }

    private static final int MENU_ID_PIN = -1;
    public static final String PARAM_NOTE_ID = "noteId";
    public static final String PARAM_NEWNOTE = "newNote";
    private static final String SAVEDKEY_NOTE = "note";
@@ -146,6 +156,10 @@ public abstract class BaseNoteFragment extends Fragment implements CategoryDialo
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_note_fragment, menu);

        if (isRequestPinShortcutSupported(getActivity()) && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            menu.add(Menu.NONE, MENU_ID_PIN, 110, R.string.pin_to_homescreen);
        }
    }

    @Override
@@ -171,6 +185,7 @@ public abstract class BaseNoteFragment extends Fragment implements CategoryDialo

        searchEditFrame.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            int oldVisibility = -1;

            @Override
            public void onGlobalLayout() {
                int currentVisibility = searchEditFrame.getVisibility();
@@ -250,6 +265,33 @@ public abstract class BaseNoteFragment extends Fragment implements CategoryDialo
                }

                return false;
            case MENU_ID_PIN:
                if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    ShortcutManager shortcutManager = getActivity().getSystemService(ShortcutManager.class);

                    if (shortcutManager.isRequestPinShortcutSupported()) {
                        Intent intent = new Intent(getActivity(), EditNoteActivity.class);
                        intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, note.getId());
                        intent.setAction(ACTION_SHORTCUT);

                        ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(getActivity(), note.getId() + "")
                                .setShortLabel(note.getTitle())
                                .setIcon(Icon.createWithResource(getActivity().getApplicationContext(), note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp))
                                .setIntent(intent)
                                .build();

                        Intent pinnedShortcutCallbackIntent =
                                shortcutManager.createShortcutResultIntent(pinShortcutInfo);

                        PendingIntent successCallback = PendingIntent.getBroadcast(getActivity(), /* request code */ 0,
                                pinnedShortcutCallbackIntent, /* flags */ 0);

                        shortcutManager.requestPinShortcut(pinShortcutInfo,
                                successCallback.getIntentSender());
                    }
                }

                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
+16 −1
Original line number Diff line number Diff line
@@ -3,9 +3,11 @@ package it.niedermann.owncloud.notes.persistence;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;

@@ -15,10 +17,12 @@ import androidx.annotation.WorkerThread;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.android.appwidget.NoteListWidget;
import it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget;
import it.niedermann.owncloud.notes.model.CloudNote;
@@ -539,6 +543,17 @@ public class NoteSQLiteOpenHelper extends SQLiteOpenHelper {
                new String[]{String.valueOf(id)});
        notifyNotesChanged();
        getNoteServerSyncHelper().scheduleSync(true);

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
            shortcutManager.getPinnedShortcuts().forEach((shortcut) -> {
                String shortcutId = id + "";
                if (shortcut.getId().equals(shortcutId)) {
                    Log.v(NoteSQLiteOpenHelper.class.getSimpleName(), "Removing shortcut for " + shortcutId);
                    shortcutManager.disableShortcuts(Collections.singletonList(shortcutId), context.getResources().getString(R.string.note_has_been_deleted));
                }
            });
        }
        return i;
    }

+2 −2
Original line number Diff line number Diff line
@@ -32,13 +32,13 @@
    <item
        android:id="@+id/menu_cancel"
        android:icon="@drawable/ic_clear_white_24dp"
        android:orderInCategory="110"
        android:orderInCategory="120"
        android:title="@string/simple_cancel"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_delete"
        android:icon="@drawable/ic_delete_white_24dp"
        android:orderInCategory="120"
        android:orderInCategory="130"
        android:title="@string/menu_delete"
        app:showAsAction="never" />

+2 −0
Original line number Diff line number Diff line
@@ -157,6 +157,8 @@
    <string name="simple_copy">Copy</string>
    <string name="simple_exception">Exception</string>
    <string name="copied_to_clipboard">Copied to clipboard</string>
    <string name="pin_to_homescreen">Pin to homescreen</string>
    <string name="note_has_been_deleted">This note has been deleted</string>

    <!-- Array: note modes -->
    <string-array name="noteMode_entries">
+1 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ buildscript {
    }
    dependencies {
        apply plugin: 'maven'
        classpath 'com.android.tools.build:gradle:3.4.0'
        classpath 'com.android.tools.build:gradle:3.4.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
Loading