Skip to content

Commit

Permalink
Merge branch 'master' into dateButtonsFixes
Browse files Browse the repository at this point in the history
  • Loading branch information
wshoy authored Sep 24, 2024
2 parents e2b1821 + d161e62 commit 912735f
Show file tree
Hide file tree
Showing 72 changed files with 417 additions and 203 deletions.
18 changes: 17 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
android:name=".activity.MainActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="standard"
android:launchMode="singleTask"
android:taskAffinity=".activity.MainActivity"
android:windowSoftInputMode="stateUnchanged|adjustResize">
<intent-filter>
Expand Down Expand Up @@ -110,6 +110,22 @@
android:name="other.writeily.widget.WrFilesWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS" />

<receiver
android:name=".widget.TodoWidgetProvider"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/todo_widget" />
</receiver>

<service
android:name=".widget.TodoWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS" />

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,23 +90,27 @@ private static void launch(
final Intent intent;
if (GsFileBrowserListAdapter.isVirtualFolder(file) || file.isDirectory()) {
intent = new Intent(activity, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
} else {
intent = new Intent(activity, DocumentActivity.class);
}

intent.putExtra(Document.EXTRA_FILE, file);
if (!(activity instanceof DocumentActivity) &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
as.isMultiWindowEnabled()
) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}

if (lineNumber != null) {
intent.putExtra(Document.EXTRA_FILE_LINE_NUMBER, lineNumber);
}
if (lineNumber != null) {
intent.putExtra(Document.EXTRA_FILE_LINE_NUMBER, lineNumber);
}

if (doPreview != null) {
intent.putExtra(Document.EXTRA_DO_PREVIEW, doPreview);
if (doPreview != null) {
intent.putExtra(Document.EXTRA_DO_PREVIEW, doPreview);
}
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && as.isMultiWindowEnabled()) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}
intent.putExtra(Document.EXTRA_FILE, file);

nextLaunchTransparentBg = (activity instanceof MainActivity);
GsContextUtils.instance.animateToActivity(activity, intent, false, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import net.gsantner.markor.model.Document;
import net.gsantner.markor.util.MarkorContextUtils;
import net.gsantner.markor.web.MarkorWebViewClient;
import net.gsantner.markor.widget.TodoWidgetProvider;
import net.gsantner.opoc.frontend.filebrowser.GsFileBrowserOptions;
import net.gsantner.opoc.frontend.settings.GsFontPreferenceCompat;
import net.gsantner.opoc.frontend.textview.TextViewUndoRedo;
Expand Down Expand Up @@ -285,6 +286,10 @@ public void onPause() {
_appSettings.addRecentFile(_document.file);
_appSettings.setDocumentPreviewState(_document.path, _isPreviewVisible);
_appSettings.setLastEditPosition(_document.path, TextViewUtils.getSelection(_hlEditor)[0]);

if(_document.path.equals(_appSettings.getTodoFile().getAbsolutePath())){
TodoWidgetProvider.updateTodoWidgets();
}
super.onPause();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import net.gsantner.markor.frontend.filebrowser.MarkorFileBrowserFactory;
import net.gsantner.markor.model.Document;
import net.gsantner.markor.util.MarkorContextUtils;
import net.gsantner.markor.widget.TodoWidgetProvider;
import net.gsantner.opoc.format.GsSimpleMarkdownParser;
import net.gsantner.opoc.frontend.base.GsFragmentBase;
import net.gsantner.opoc.frontend.filebrowser.GsFileBrowserFragment;
Expand Down Expand Up @@ -486,6 +487,7 @@ public GsFileBrowserFragment getNotebook() {
protected void onPause() {
super.onPause();
WrMarkorWidgetProvider.updateLauncherWidgets();
TodoWidgetProvider.updateTodoWidgets();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import net.gsantner.markor.model.AppSettings;
import net.gsantner.markor.util.BackupUtils;
import net.gsantner.markor.util.MarkorContextUtils;
import net.gsantner.markor.widget.TodoWidgetProvider;
import net.gsantner.opoc.frontend.base.GsActivityBase;
import net.gsantner.opoc.frontend.base.GsPreferenceFragmentBase;
import net.gsantner.opoc.frontend.filebrowser.GsFileBrowserOptions;
Expand Down Expand Up @@ -231,6 +232,7 @@ protected void onPreferenceChanged(final SharedPreferences prefs, final String k
}
} else if (eq(key, R.string.pref_key__notebook_directory, R.string.pref_key__quicknote_filepath, R.string.pref_key__todo_filepath)) {
WrMarkorWidgetProvider.updateLauncherWidgets();
TodoWidgetProvider.updateTodoWidgets();
}
}

Expand Down
18 changes: 10 additions & 8 deletions app/src/main/java/net/gsantner/markor/format/ActionButtonBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -966,32 +966,34 @@ public void runSpecialKeyAction() {
_hlEditor.simulateKeyPress(KeyEvent.KEYCODE_MOVE_END);
} else if (callbackPayload.equals(rstr(R.string.key_pos_1_document))) {
_hlEditor.setSelection(0);
} else if (callbackPayload.equals(rstr(R.string.key_pos_end_document))) {
_hlEditor.setSelection(_hlEditor.length());
} else if (callbackPayload.equals(rstr(R.string.move_text_one_line_up))) {
ActionButtonBase.moveLineSelectionBy1(_hlEditor, true);
} else if (callbackPayload.equals(rstr(R.string.move_text_one_line_down))) {
ActionButtonBase.moveLineSelectionBy1(_hlEditor, false);
} else if (callbackPayload.equals(rstr(R.string.key_pos_end_document))) {
_hlEditor.setSelection(_hlEditor.length());
} else if (callbackPayload.equals(rstr(R.string.select_current_line))) {
selectWholeLines(_hlEditor.getText());
} else if (callbackPayload.equals(rstr(R.string.key_ctrl_a))) {
_hlEditor.setSelection(0, _hlEditor.length());
} else if (callbackPayload.equals(rstr(R.string.key_tab))) {
_hlEditor.insertOrReplaceTextOnCursor("\u0009");
} else if (callbackPayload.equals(rstr(R.string.zero_width_space))) {
_hlEditor.insertOrReplaceTextOnCursor("\u200B");
} else if (callbackPayload.equals(rstr(R.string.search))) {
onSearch();
} else if (callbackPayload.equals(rstr(R.string.em_space))) {
_hlEditor.insertOrReplaceTextOnCursor("\u2003");
} else if (callbackPayload.equals(rstr(R.string.break_page_pdf_print))) {
_hlEditor.insertOrReplaceTextOnCursor("<div style='page-break-after:always;'></div>");
} else if (callbackPayload.equals(rstr(R.string.search))) {
onSearch();
} else if (callbackPayload.equals(rstr(R.string.ohm))) {
_hlEditor.insertOrReplaceTextOnCursor("Ω");
} else if (callbackPayload.equals(rstr(R.string.char_punctation_mark_arrows))) {
_hlEditor.insertOrReplaceTextOnCursor("»«");
} else if (callbackPayload.equals(rstr(R.string.continued_overline))) {
_hlEditor.insertOrReplaceTextOnCursor("‾‾‾‾‾");
} else if (callbackPayload.equals(rstr(R.string.shrug))) {
_hlEditor.insertOrReplaceTextOnCursor(\\_(ツ)_/¯");
} else if (callbackPayload.equals(rstr(R.string.char_punctation_mark_arrows))) {
_hlEditor.insertOrReplaceTextOnCursor("»«");
} else if (callbackPayload.equals(rstr(R.string.select_current_line))) {
selectWholeLines(_hlEditor.getText());
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,8 @@ public static String getSelectedLines(final CharSequence seq) {
**/
public static String getSelectedLines(final CharSequence seq, final int... sel) {
if (sel != null && sel.length > 0 && GsTextUtils.isValidSelection(seq, sel)) {
return seq.subSequence(getLineStart(seq, sel[0]), getLineEnd(seq, sel[1])).toString();
final int start = sel[0], end = sel.length > 1 ? sel[1] : sel[0];
return seq.subSequence(getLineStart(seq, start), getLineEnd(seq, end)).toString();
} else {
return "";
}
Expand All @@ -178,9 +179,7 @@ public static String getSelectedLines(final CharSequence seq, final int... sel)
/**
* Convert a char index to a line index + offset from end of line
*
* @param s text to parse
* @param p position in text
* @return int[2] where index 0 is line and index 1 is position from end of line
* @return int[n][2] where for each input, index 0 is line and index 1 is position from end of line
*/
public static int[][] getLineOffsetFromIndex(final CharSequence text, final int ... sel) {
final int[][] offsets = new int[sel.length][2];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ public void setEditorBasicColor(boolean forDarkMode, @ColorRes int fgColor, @Col

public boolean isMultiWindowEnabled() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return getBool(R.string.pref_key__is_multi_window_enabled, true);
return getBool(R.string.pref_key__is_multi_window_enabled, false);
} else {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package net.gsantner.markor.widget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.widget.RemoteViews;

import net.gsantner.markor.ApplicationObject;
import net.gsantner.markor.R;
import net.gsantner.markor.activity.openeditor.OpenFromShortcutOrWidgetActivity;
import net.gsantner.markor.model.AppSettings;
import net.gsantner.markor.model.Document;

public class TodoWidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

int requestCode = 1;
final AppSettings appSettings = ApplicationObject.settings();

final int staticFlags = PendingIntent.FLAG_UPDATE_CURRENT | (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0);
final int mutableFlags = PendingIntent.FLAG_UPDATE_CURRENT | (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? PendingIntent.FLAG_MUTABLE : 0);

for (int appWidgetId : appWidgetIds) {

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.todo_widget_layout);

final Intent intent = new Intent(context, TodoWidgetService.class);
views.setRemoteAdapter(R.id.todo_widget_list_view, intent);
views.setEmptyView(R.id.todo_widget_list_view, R.id.todo_widget_empty_view);
views.setInt(R.id.todo_widget_list_view, "setBackgroundColor", appSettings.getEditorBackgroundColor());

final Intent openTodo = new Intent(context, OpenFromShortcutOrWidgetActivity.class)
.setAction(Intent.ACTION_EDIT)
.putExtra(Document.EXTRA_FILE, appSettings.getTodoFile());
views.setPendingIntentTemplate(R.id.todo_widget_list_view, PendingIntent.getActivity(context, requestCode++, openTodo, mutableFlags));
views.setOnClickPendingIntent(R.id.todo_widget_container, PendingIntent.getActivity(context, requestCode++, openTodo, staticFlags));

// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}

super.onUpdate(context, appWidgetManager, appWidgetIds);
}

// Update all widget lists and shortcuts for all widgets
public static void updateTodoWidgets() {
final Context context = ApplicationObject.get().getApplicationContext();
final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
if (appWidgetManager == null) {
// The device does not support widgets.
return;
}
final ComponentName comp = new ComponentName(context, TodoWidgetProvider.class);
final int[] appWidgetIds = appWidgetManager.getAppWidgetIds(comp);

// Update List
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.todo_widget_list_view);

// Trigger remote views update
context.sendBroadcast(new Intent(context, TodoWidgetProvider.class)
.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package net.gsantner.markor.widget;

import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;

import net.gsantner.markor.ApplicationObject;
import net.gsantner.markor.R;
import net.gsantner.markor.format.todotxt.TodoTxtTask;
import net.gsantner.markor.model.AppSettings;
import net.gsantner.markor.model.Document;

import java.util.ArrayList;
import java.util.List;

public class TodoWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {

private final Context _context;
private final AppSettings _appSettings;
private final Document _document;
private final List<TodoTxtTask> _tasks;

public TodoWidgetRemoteViewsFactory(Context context, Intent intent) {
_context = context;
_appSettings = ApplicationObject.settings();
_document = new Document(_appSettings.getTodoFile());
_tasks = new ArrayList<>();
}

@Override
public void onCreate() {
onDataSetChanged();
}

@Override
public void onDataSetChanged() {
_tasks.clear();
final String content = _document.loadContent(_context);
if (content == null) {
return;
}
List<TodoTxtTask> tasks = TodoTxtTask.getAllTasks(content);
_tasks.addAll(tasks);
}

@Override
public void onDestroy() {
_tasks.clear();
}

@Override
public int getCount() {
return _tasks.size();
}

@Override
public RemoteViews getViewAt(int position) {
RemoteViews views = new RemoteViews(_context.getPackageName(), R.layout.todo_widget_list_item);
views.setTextViewText(R.id.todo_widget_item_text, _tasks.get(position).getDescription());
views.setInt(R.id.todo_widget_item_text, "setTextColor", _appSettings.getEditorForegroundColor());

final Intent fillInIntent = new Intent()
.putExtra(Document.EXTRA_FILE_LINE_NUMBER, position);
views.setOnClickFillInIntent(R.id.todo_widget_item_text, fillInIntent);

return views;
}

@Override
public RemoteViews getLoadingView() {
return null;
}

@Override
public int getViewTypeCount() {
return 1;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public boolean hasStableIds() {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

package net.gsantner.markor.widget;

import android.content.Intent;
import android.widget.RemoteViewsService;

public class TodoWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return (new TodoWidgetRemoteViewsFactory(getApplicationContext(), intent));
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions app/src/main/res/layout/todo_widget_layout.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/todo_widget_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background">

<ListView
android:id="@+id/todo_widget_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/grey"
android:dividerHeight="0.5dp" />

<TextView
android:id="@+id/todo_widget_empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Empty"
android:gravity="center"
android:visibility="gone" />
</LinearLayout>
Loading

0 comments on commit 912735f

Please sign in to comment.