Skip to content

Commit b0bd2aa

Browse files
authored
Adds Javascript API to customize the font picker (#363)
1 parent 5d5f53f commit b0bd2aa

File tree

7 files changed

+626
-359
lines changed

7 files changed

+626
-359
lines changed

android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@
1414
import com.facebook.react.uimanager.annotations.ReactProp;
1515
import com.pspdfkit.annotations.Annotation;
1616
import com.pspdfkit.preferences.PSPDFKitPreferences;
17-
import com.pspdfkit.react.events.PdfViewAnnotationChangedEvent;
18-
import com.pspdfkit.react.events.PdfViewAnnotationTappedEvent;
1917
import com.pspdfkit.react.events.PdfViewDataReturnedEvent;
20-
import com.pspdfkit.react.events.PdfViewDocumentLoadFailedEvent;
21-
import com.pspdfkit.react.events.PdfViewDocumentSaveFailedEvent;
22-
import com.pspdfkit.react.events.PdfViewDocumentSavedEvent;
23-
import com.pspdfkit.react.events.PdfViewStateChangedEvent;
2418
import com.pspdfkit.react.menu.ReactGroupingRule;
2519
import com.pspdfkit.views.PdfView;
2620

@@ -154,10 +148,20 @@ public void setShowNavigationButtonInToolbar(@NonNull final PdfView view, final
154148
}
155149

156150
@ReactProp(name= "hideDefaultToolbar")
157-
public void setHideDefaultToolbar(@NonNull final PdfView view,final boolean hideDefaultToolbar) {
151+
public void setHideDefaultToolbar(@NonNull final PdfView view, final boolean hideDefaultToolbar) {
158152
view.setHideDefaultToolbar(hideDefaultToolbar);
159153
}
160154

155+
@ReactProp(name = "availableFontNames")
156+
public void setAvailableFontNames(@NonNull final PdfView view, @Nullable final ReadableArray availableFontNames) {
157+
view.setAvailableFontNames(availableFontNames);
158+
}
159+
160+
@ReactProp(name = "selectedFontName")
161+
public void setSelectedFontName(@NonNull final PdfView view, @Nullable final String selectedFontName) {
162+
view.setSelectedFontName(selectedFontName);
163+
}
164+
161165
@Nullable
162166
@Override
163167
public Map getExportedCustomDirectEventTypeConstants() {

android/src/main/java/com/pspdfkit/views/PdfView.java

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.net.Uri;
66
import android.util.AttributeSet;
7+
import android.util.Log;
78
import android.util.Pair;
89
import android.view.Choreographer;
910
import android.view.View;
@@ -13,10 +14,14 @@
1314
import androidx.annotation.Nullable;
1415
import androidx.fragment.app.FragmentManager;
1516

17+
import com.facebook.react.bridge.ReadableArray;
1618
import com.facebook.react.bridge.ReadableMap;
1719
import com.facebook.react.common.MapBuilder;
1820
import com.facebook.react.uimanager.events.EventDispatcher;
21+
import com.pspdfkit.PSPDFKit;
1922
import com.pspdfkit.annotations.Annotation;
23+
import com.pspdfkit.annotations.AnnotationType;
24+
import com.pspdfkit.annotations.configuration.FreeTextAnnotationConfiguration;
2025
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
2126
import com.pspdfkit.document.PdfDocument;
2227
import com.pspdfkit.document.PdfDocumentLoader;
@@ -42,9 +47,11 @@
4247
import com.pspdfkit.ui.PdfFragment;
4348
import com.pspdfkit.ui.PdfUiFragment;
4449
import com.pspdfkit.ui.PdfUiFragmentBuilder;
50+
import com.pspdfkit.ui.fonts.Font;
51+
import com.pspdfkit.ui.fonts.FontManager;
4552
import com.pspdfkit.ui.search.PdfSearchView;
4653
import com.pspdfkit.ui.search.PdfSearchViewInline;
47-
import com.pspdfkit.ui.toolbar.MainToolbar;
54+
import com.pspdfkit.ui.special_mode.controller.AnnotationTool;
4855
import com.pspdfkit.ui.toolbar.grouping.MenuItemGroupingRule;
4956

5057
import org.json.JSONArray;
@@ -84,6 +91,7 @@ public class PdfView extends FrameLayout {
8491

8592
/** Key to use when setting the id argument of PdfFragments created by this PdfView. */
8693
private static final String ARG_ROOT_ID = "root_id";
94+
private static final String TAG = "PdfView";
8795

8896
private FragmentManager fragmentManager;
8997
private EventDispatcher eventDispatcher;
@@ -116,6 +124,18 @@ public class PdfView extends FrameLayout {
116124
/** We keep track if the inline search view is shown since we don't want to add a second navigation button while it is shown. */
117125
private boolean isSearchViewShown = false;
118126

127+
/** Disposable keeping track of our subscription to update the annotation configuration on each emitted PdfFragment. */
128+
@Nullable
129+
private Disposable updateAnnotationConfigurationDisposable;
130+
131+
/** The currently configured array of available font names for free text annotations. */
132+
@Nullable
133+
private ReadableArray availableFontNames;
134+
135+
/** The currently configured default font name for free text annotations. */
136+
@Nullable
137+
private String selectedFontName;
138+
119139
public PdfView(@NonNull Context context) {
120140
super(context);
121141
init();
@@ -233,6 +253,63 @@ public void setMenuItemGroupingRule(@NonNull MenuItemGroupingRule groupingRule)
233253
pdfViewModeController.setMenuItemGroupingRule(groupingRule);
234254
}
235255

256+
public void setAvailableFontNames(@Nullable final ReadableArray availableFontNames) {
257+
this.availableFontNames = availableFontNames;
258+
updateAnnotationConfiguration();
259+
}
260+
261+
public void setSelectedFontName(@Nullable final String selectedFontName) {
262+
this.selectedFontName = selectedFontName;
263+
updateAnnotationConfiguration();
264+
}
265+
266+
private void updateAnnotationConfiguration() {
267+
if (updateAnnotationConfigurationDisposable != null) {
268+
updateAnnotationConfigurationDisposable.dispose();
269+
}
270+
271+
// First we create the new FreeTextAnnotationConfiguration.
272+
FreeTextAnnotationConfiguration.Builder builder = FreeTextAnnotationConfiguration.builder(getContext());
273+
FontManager systemFontManager = PSPDFKit.getSystemFontManager();
274+
if (availableFontNames != null) {
275+
// Custom list of available fonts is set.
276+
final ArrayList<Font> availableFonts = new ArrayList<>();
277+
for (int i = 0; i < availableFontNames.size(); i++) {
278+
final String fontName = availableFontNames.getString(i);
279+
final Font font = systemFontManager.getFontByName(fontName);
280+
if (font != null) {
281+
availableFonts.add(font);
282+
} else {
283+
Log.w(TAG, String.format("Failed to add font %s to list of available fonts since it wasn't found in the list of system fonts.", fontName));
284+
}
285+
}
286+
builder.setAvailableFonts(availableFonts);
287+
}
288+
289+
if (selectedFontName != null) {
290+
final Font defaultFont = systemFontManager.getFontByName(selectedFontName);
291+
if (defaultFont != null) {
292+
builder.setDefaultFont(defaultFont);
293+
} else {
294+
Log.w(TAG, String.format("Failed to set default font to %s since it wasn't found in the list of system fonts.", selectedFontName));
295+
}
296+
}
297+
298+
final FreeTextAnnotationConfiguration configuration = builder.build();
299+
// We want to set this on the current PdfFragment and all future ones.
300+
// We use the observable emitting PdfFragments for this purpose.
301+
updateAnnotationConfigurationDisposable = getPdfFragment()
302+
.observeOn(AndroidSchedulers.mainThread())
303+
.subscribe(pdfFragment -> {
304+
pdfFragment.getAnnotationConfiguration().put(
305+
AnnotationTool.FREETEXT,configuration);
306+
pdfFragment.getAnnotationConfiguration().put(
307+
AnnotationType.FREETEXT,configuration);
308+
pdfFragment.getAnnotationConfiguration().put(
309+
AnnotationTool.FREETEXT_CALLOUT,configuration);
310+
});
311+
}
312+
236313
public void setShowNavigationButtonInToolbar(final boolean showNavigationButtonInToolbar) {
237314
isNavigationButtonShown = showNavigationButtonInToolbar;
238315
pendingFragmentActions.add(getCurrentPdfUiFragment()

0 commit comments

Comments
 (0)