Skip to content

Commit 6c9d6c6

Browse files
committed
Use deep links rather than a trampoline
1 parent b5ba7de commit 6c9d6c6

File tree

11 files changed

+157
-115
lines changed

11 files changed

+157
-115
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@
6767
<intent-filter>
6868
<action android:name="android.intent.action.MAIN" />
6969
<category android:name="android.intent.category.LAUNCHER" />
70-
<data android:scheme="${applicationId}" android:host="file_browser" />
70+
</intent-filter>
71+
<intent-filter>
72+
<action android:name="android.intent.action.VIEW" />
73+
<category android:name="android.intent.category.DEFAULT" />
74+
<category android:name="android.intent.category.BROWSABLE" />
75+
<data android:scheme="${applicationId}" android:host="@string/deep_link_host__file_browser" />
7176
</intent-filter>
7277
</activity>
7378

@@ -180,11 +185,6 @@
180185
</intent-filter>
181186
</activity>
182187

183-
<activity
184-
android:name=".activity.openeditor.OpenFromShortcutOrWidgetActivity"
185-
android:launchMode="standard"
186-
android:theme="@android:style/Theme.NoDisplay" />
187-
188188
<activity
189189
android:name=".activity.DocumentActivity"
190190
android:exported="true"
@@ -194,6 +194,13 @@
194194
android:theme="@style/AppTheme.Unified.StartupFlash"
195195
android:windowSoftInputMode="stateUnchanged|adjustResize"
196196
tools:targetApi="lollipop">
197+
<intent-filter>
198+
<action android:name="android.intent.action.VIEW" />
199+
<category android:name="android.intent.category.DEFAULT" />
200+
<category android:name="android.intent.category.BROWSABLE" />
201+
<data android:scheme="${applicationId}" android:host="@string/deep_link_host__document_viewer_editor" />
202+
</intent-filter>
203+
197204
<intent-filter>
198205
<action android:name="android.intent.action.SEND" />
199206
<action android:name="com.google.android.gm.action.AUTO_SEND" />
@@ -221,7 +228,6 @@
221228
<data android:mimeType="text/htm" />
222229
<data android:mimeType="text/html" />
223230

224-
<data android:scheme="${applicationId}" android:host="document_editor_viewer" />
225231
</intent-filter>
226232

227233
<intent-filter>

app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import android.app.Activity;
1111
import android.app.ActivityManager;
12+
import android.content.Context;
1213
import android.content.Intent;
1314
import android.graphics.Rect;
1415
import android.graphics.RectF;
@@ -30,6 +31,7 @@
3031
import net.gsantner.markor.frontend.textview.TextViewUtils;
3132
import net.gsantner.markor.model.AppSettings;
3233
import net.gsantner.markor.model.Document;
34+
import net.gsantner.markor.BuildConfig;
3335
import net.gsantner.markor.util.MarkorContextUtils;
3436
import net.gsantner.opoc.format.GsTextUtils;
3537
import net.gsantner.opoc.frontend.base.GsFragmentBase;
@@ -45,6 +47,31 @@ public class DocumentActivity extends MarkorBaseActivity {
4547
private Toolbar _toolbar;
4648
private FragmentManager _fragManager;
4749

50+
public static Intent applyDeepLink(final Context context, final File file, final Intent intent) {
51+
if (context == null || file == null || intent == null) {
52+
return intent;
53+
}
54+
55+
final boolean isDirectory = GsFileUtils.isDirectory(file);
56+
final String host = context.getString(isDirectory ? R.string.deep_link_host__file_browser : R.string.deep_link_host__document_viewer_editor);
57+
58+
final Uri data = new Uri.Builder()
59+
.scheme(BuildConfig.APPLICATION_ID)
60+
.authority(host)
61+
.encodedPath(file.getAbsolutePath())
62+
.build();
63+
64+
intent.setAction(Intent.ACTION_VIEW);
65+
intent.addCategory(Intent.CATEGORY_DEFAULT);
66+
intent.setData(data);
67+
intent.setPackage(context.getPackageName());
68+
return intent;
69+
}
70+
71+
public static Intent buildDeepLinkIntent(final Context context, final File file) {
72+
return applyDeepLink(context, file, new Intent());
73+
}
74+
4875
public static void launch(final Activity activity, final Intent intent) {
4976
final File file = MarkorContextUtils.getIntentFile(intent);
5077
final Integer lineNumber = intent.hasExtra(Document.EXTRA_FILE_LINE_NUMBER) ? intent.getIntExtra(Document.EXTRA_FILE_LINE_NUMBER, -1) : null;
@@ -84,11 +111,9 @@ private static void launch(
84111

85112
final AppSettings as = AppSettings.get(activity);
86113

87-
final Intent intent;
88-
if (GsFileUtils.isDirectory(file)) {
89-
intent = new Intent(activity, MainActivity.class);
90-
} else {
91-
intent = new Intent(activity, DocumentActivity.class);
114+
final Intent intent = buildDeepLinkIntent(activity, file);
115+
116+
if (!GsFileUtils.isDirectory(file)) {
92117

93118
final boolean lollipop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
94119
final boolean fromDocumentActivity = activity instanceof DocumentActivity;
@@ -183,9 +208,9 @@ private void handleLaunchingIntent(final Intent intent) {
183208
if (file == null || !_cu.canWriteFile(this, file, false, true)) {
184209
showNotSupportedMessage();
185210
} else {
186-
Integer startLine = null;
187211
// Open in editor/viewer
188212
final Document doc = new Document(file);
213+
Integer startLine = null;
189214
if (intent.hasExtra(Document.EXTRA_FILE_LINE_NUMBER)) {
190215
startLine = intent.getIntExtra(Document.EXTRA_FILE_LINE_NUMBER, -1);
191216
} else if (intentData != null) {
@@ -357,4 +382,4 @@ public boolean onKeyDown(int keyCode, KeyEvent event) {
357382
private GsFragmentBase<?, ?> getCurrentVisibleFragment() {
358383
return (GsFragmentBase<?, ?>) getSupportFragmentManager().findFragmentById(R.id.document__placeholder_fragment);
359384
}
360-
}
385+
}

app/src/main/java/net/gsantner/markor/activity/openeditor/OpenEditorActivity.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.gsantner.markor.activity.MarkorBaseActivity;
1616
import net.gsantner.markor.activity.StoragePermissionActivity;
1717
import net.gsantner.markor.model.Document;
18+
import net.gsantner.markor.activity.DocumentActivity;
1819

1920
import java.io.File;
2021

@@ -27,14 +28,14 @@ protected void onCreate(@Nullable final Bundle savedInstanceState) {
2728
}
2829

2930
protected void openEditorForFile(final File file, final Integer line) {
30-
final Intent openIntent = new Intent(getApplicationContext(), OpenFromShortcutOrWidgetActivity.class)
31-
.setAction(Intent.ACTION_EDIT)
32-
.putExtra(Document.EXTRA_FILE, file);
31+
final Intent openIntent = DocumentActivity.buildDeepLinkIntent(getApplicationContext(), file);
3332

34-
if (line != null) {
33+
if (openIntent != null && line != null) {
3534
openIntent.putExtra(Document.EXTRA_FILE_LINE_NUMBER, line);
3635
}
3736

38-
_cu.animateToActivity(this, openIntent, true, 1);
37+
if (openIntent != null) {
38+
_cu.animateToActivity(this, openIntent, true, 1);
39+
}
3940
}
4041
}

app/src/main/java/net/gsantner/markor/activity/openeditor/OpenFromShortcutOrWidgetActivity.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

app/src/main/java/net/gsantner/markor/activity/openeditor/OpenShareIntoActivity.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@
1212

1313
import androidx.annotation.Nullable;
1414

15+
import net.gsantner.markor.activity.DocumentActivity;
16+
1517
public class OpenShareIntoActivity extends OpenEditorActivity {
1618

1719
@Override
1820
protected void onCreate(@Nullable Bundle savedInstanceState) {
1921
super.onCreate(savedInstanceState);
2022

21-
final Intent openShare = new Intent(this, OpenFromShortcutOrWidgetActivity.class)
22-
.setAction(Intent.ACTION_SEND)
23-
.putExtra(Intent.EXTRA_TEXT, "");
23+
final Intent openShare = new Intent(Intent.ACTION_SEND)
24+
.setType("text/plain")
25+
.putExtra(Intent.EXTRA_TEXT, "")
26+
.setClass(this, DocumentActivity.class)
27+
.setPackage(getPackageName());
2428

2529
_cu.animateToActivity(this, openShare, true, 1);
2630
}

app/src/main/java/net/gsantner/markor/util/MarkorContextUtils.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import android.content.ActivityNotFoundException;
1212
import android.content.Context;
1313
import android.content.Intent;
14-
import android.net.Uri;
1514
import android.os.Build;
1615
import android.print.PrintJob;
1716
import android.text.TextUtils;
@@ -25,8 +24,8 @@
2524
import net.gsantner.markor.R;
2625
import net.gsantner.markor.activity.openeditor.OpenEditorQuickNoteActivity;
2726
import net.gsantner.markor.activity.openeditor.OpenEditorTodoActivity;
28-
import net.gsantner.markor.activity.openeditor.OpenFromShortcutOrWidgetActivity;
2927
import net.gsantner.markor.activity.openeditor.OpenShareIntoActivity;
28+
import net.gsantner.markor.activity.DocumentActivity;
3029
import net.gsantner.markor.model.Document;
3130
import net.gsantner.opoc.frontend.filebrowser.GsFileBrowserListAdapter;
3231
import net.gsantner.opoc.util.GsContextUtils;
@@ -71,8 +70,10 @@ public <T extends GsContextUtils> T createLauncherDesktopShortcut(final Context
7170
title = title == null ? GsFileUtils.getFilenameWithoutExtension(file) : title;
7271
if (!TextUtils.isEmpty(title)) {
7372
final int iconRes = getIconResForFile(file);
74-
final Intent intent = new Intent(context, OpenFromShortcutOrWidgetActivity.class).setData(Uri.fromFile(file));
75-
createLauncherDesktopShortcut(context, intent, iconRes, title);
73+
final Intent intent = DocumentActivity.buildDeepLinkIntent(context, file);
74+
if (intent != null) {
75+
createLauncherDesktopShortcut(context, intent, iconRes, title);
76+
}
7677
}
7778
return thisp();
7879
}

app/src/main/java/net/gsantner/markor/util/ShortcutUtils.java

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@
1212
import android.content.pm.ShortcutInfo;
1313
import android.content.pm.ShortcutManager;
1414
import android.graphics.drawable.Icon;
15-
import android.net.Uri;
1615
import android.os.Build;
1716

1817
import androidx.annotation.NonNull;
1918

2019
import net.gsantner.markor.R;
21-
import net.gsantner.markor.activity.openeditor.OpenFromShortcutOrWidgetActivity;
20+
import net.gsantner.markor.activity.DocumentActivity;
2221
import net.gsantner.markor.model.AppSettings;
2322
import net.gsantner.markor.model.Document;
2423

@@ -62,51 +61,55 @@ public static void setShortcuts(@NonNull Context context) {
6261
final AppSettings appSettings = AppSettings.get(context);
6362

6463
// Create the to-do shortcut
65-
final Intent openTodo = new Intent(context, OpenFromShortcutOrWidgetActivity.class)
66-
.setAction(Intent.ACTION_EDIT)
67-
.setData(Uri.fromFile(appSettings.getTodoFile()))
68-
.putExtra(Document.EXTRA_FILE_LINE_NUMBER, -1);
69-
70-
final ShortcutInfo shortcutToDo = new ShortcutInfo.Builder(context, ID_TO_DO)
71-
.setShortLabel(createShortLabel(context.getString(R.string.todo)))
72-
.setLongLabel(createLongLabel(context.getString(R.string.todo)))
73-
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_todo))
74-
.setIntent(openTodo)
75-
.build();
76-
newShortcuts.add(shortcutToDo);
64+
final Intent openTodo = DocumentActivity.buildDeepLinkIntent(context, appSettings.getTodoFile());
65+
if (openTodo != null) {
66+
openTodo.putExtra(Document.EXTRA_FILE_LINE_NUMBER, -1);
67+
}
68+
69+
if (openTodo != null) {
70+
final ShortcutInfo shortcutToDo = new ShortcutInfo.Builder(context, ID_TO_DO)
71+
.setShortLabel(createShortLabel(context.getString(R.string.todo)))
72+
.setLongLabel(createLongLabel(context.getString(R.string.todo)))
73+
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_todo))
74+
.setIntent(openTodo)
75+
.build();
76+
newShortcuts.add(shortcutToDo);
77+
}
7778

7879
// Create the QuickNote shortcut
79-
final Intent openQuickNote = new Intent(context, OpenFromShortcutOrWidgetActivity.class)
80-
.setAction(Intent.ACTION_EDIT)
81-
.setData(Uri.fromFile(appSettings.getQuickNoteFile()))
82-
.putExtra(Document.EXTRA_FILE_LINE_NUMBER, -1);
83-
84-
final ShortcutInfo shortcutQuickNote = new ShortcutInfo.Builder(context, ID_QUICK_NOTE)
85-
.setShortLabel(createShortLabel(context.getString(R.string.quicknote)))
86-
.setLongLabel(createLongLabel(context.getString(R.string.quicknote)))
87-
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_quicknote))
88-
.setIntent(openQuickNote)
89-
.build();
90-
newShortcuts.add(shortcutQuickNote);
80+
final Intent openQuickNote = DocumentActivity.buildDeepLinkIntent(context, appSettings.getQuickNoteFile());
81+
if (openQuickNote != null) {
82+
openQuickNote.putExtra(Document.EXTRA_FILE_LINE_NUMBER, -1);
83+
}
84+
85+
if (openQuickNote != null) {
86+
final ShortcutInfo shortcutQuickNote = new ShortcutInfo.Builder(context, ID_QUICK_NOTE)
87+
.setShortLabel(createShortLabel(context.getString(R.string.quicknote)))
88+
.setLongLabel(createLongLabel(context.getString(R.string.quicknote)))
89+
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_quicknote))
90+
.setIntent(openQuickNote)
91+
.build();
92+
newShortcuts.add(shortcutQuickNote);
93+
}
9194

9295
// Generate shortcuts for the most recent documents. Maximum of MAX_RECENT_DOCUMENTS.
9396
final List<String> recentDocuments = appSettings.getRecentDocuments();
9497

9598
for (int i = 0; i < Math.min(MAX_RECENT_DOCUMENTS, recentDocuments.size()); i++) {
9699
final File file = new File(recentDocuments.get(i));
97100

98-
final Intent openFile = new Intent(context, OpenFromShortcutOrWidgetActivity.class)
99-
.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
100-
.setAction(Intent.ACTION_EDIT)
101-
.setData(Uri.fromFile(file));
102-
103-
final String name = file.getName();
104-
newShortcuts.add(new ShortcutInfo.Builder(context, ID_PREFIX + name)
105-
.setShortLabel(createShortLabel(name))
106-
.setLongLabel(createLongLabel(name))
107-
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_file))
108-
.setIntent(openFile)
109-
.build());
101+
final Intent openFile = DocumentActivity.buildDeepLinkIntent(context, file);
102+
if (openFile != null) {
103+
openFile.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
104+
105+
final String name = file.getName();
106+
newShortcuts.add(new ShortcutInfo.Builder(context, ID_PREFIX + name)
107+
.setShortLabel(createShortLabel(name))
108+
.setLongLabel(createLongLabel(name))
109+
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_file))
110+
.setIntent(openFile)
111+
.build());
112+
}
110113
}
111114

112115
shortcutManager.setDynamicShortcuts(newShortcuts);

app/src/main/java/net/gsantner/markor/widget/TodoWidgetProvider.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
import android.content.ComponentName;
77
import android.content.Context;
88
import android.content.Intent;
9+
import android.net.Uri;
910
import android.os.Build;
1011
import android.widget.RemoteViews;
1112

1213
import net.gsantner.markor.ApplicationObject;
1314
import net.gsantner.markor.R;
14-
import net.gsantner.markor.activity.openeditor.OpenFromShortcutOrWidgetActivity;
1515
import net.gsantner.markor.model.AppSettings;
1616
import net.gsantner.markor.model.Document;
17+
import net.gsantner.markor.BuildConfig;
18+
19+
import java.io.File;
1720

1821
public class TodoWidgetProvider extends AppWidgetProvider {
1922

@@ -35,9 +38,17 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] a
3538
views.setEmptyView(R.id.todo_widget_list_view, R.id.todo_widget_empty_view);
3639
views.setInt(R.id.todo_widget_list_view, "setBackgroundColor", appSettings.getEditorBackgroundColor());
3740

38-
final Intent openTodo = new Intent(context, OpenFromShortcutOrWidgetActivity.class)
39-
.setAction(Intent.ACTION_EDIT)
40-
.putExtra(Document.EXTRA_FILE, appSettings.getTodoFile());
41+
final File todoFile = appSettings.getTodoFile();
42+
final Uri documentDeepLink = new Uri.Builder()
43+
.scheme(BuildConfig.APPLICATION_ID)
44+
.authority(context.getString(R.string.deep_link_host__document_viewer_editor))
45+
.encodedPath(todoFile.getAbsolutePath())
46+
.build();
47+
final Intent openTodo = new Intent(Intent.ACTION_VIEW, documentDeepLink)
48+
.addCategory(Intent.CATEGORY_DEFAULT)
49+
.putExtra(Document.EXTRA_FILE, todoFile)
50+
.setPackage(context.getPackageName());
51+
4152
views.setPendingIntentTemplate(R.id.todo_widget_list_view, PendingIntent.getActivity(context, requestCode++, openTodo, mutableFlags));
4253
views.setOnClickPendingIntent(R.id.todo_widget_container, PendingIntent.getActivity(context, requestCode++, openTodo, staticFlags));
4354

app/src/main/res/values/string-not_translatable.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ work. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.
172172
<string name="pref_key__more_info__rate_app" translatable="false">pref_key__more_info__rate_app</string>
173173
<string name="pref_key__more_info__translate" translatable="false">pref_key__more_info__translate</string>
174174
<string name="pref_key__more_info__join_community" translatable="false">pref_key__more_info__join_community</string>
175+
<string name="deep_link_host__file_browser" translatable="false">file_browser</string>
176+
<string name="deep_link_host__document_viewer_editor" translatable="false">document_viewer_editor</string>
175177

176178
<string name="pref_key__more_info__app" translatable="false">pref_key__more_info__app</string>
177179
<string name="pref_key__more_info__project_community" translatable="false">pref_key__more_info__project_community</string>

0 commit comments

Comments
 (0)