Skip to content

Commit 70697d5

Browse files
authored
Merge pull request #46 from PSPDFKit/rad/page-mode
Expose pageLayoutMode and isFirstPageAlwaysSingle configuration options
2 parents 4b11957 + a935126 commit 70697d5

File tree

5 files changed

+111
-10
lines changed

5 files changed

+111
-10
lines changed

android/src/main/java/com/pspdfkit/flutter/pspdfkit/ConfigurationAdapter.java

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.pspdfkit.configuration.activity.ThumbnailBarMode;
2020
import com.pspdfkit.configuration.activity.UserInterfaceViewMode;
2121
import com.pspdfkit.configuration.page.PageFitMode;
22+
import com.pspdfkit.configuration.page.PageLayoutMode;
2223
import com.pspdfkit.configuration.page.PageScrollDirection;
2324
import com.pspdfkit.configuration.page.PageScrollMode;
2425
import com.pspdfkit.configuration.settings.SettingsMenuItemType;
@@ -35,6 +36,10 @@
3536
class ConfigurationAdapter {
3637
private static final String LOG_TAG = "ConfigurationAdapter";
3738

39+
private static final String PAGE_LAYOUT_MODE = "pageLayoutMode";
40+
private static final String PAGE_LAYOUT_MODE_SINGLE = "single";
41+
private static final String PAGE_LAYOUT_MODE_DOUBLE = "double";
42+
private static final String PAGE_LAYOUT_MODE_AUTO = "automatic";
3843
private static final String PAGE_SCROLL_DIRECTION = "pageScrollDirection";
3944
private static final String PAGE_SCROLL_DIRECTION_HORIZONTAL = "horizontal";
4045
private static final String PAGE_SCROLL_DIRECTION_VERTICAL = "vertical";
@@ -76,8 +81,9 @@ class ConfigurationAdapter {
7681
private static final String ANDROID_DARK_THEME_RESOURCE = "darkThemeResource";
7782
private static final String ANDROID_DEFAULT_THEME_RESOURCE = "defaultThemeResource";
7883
private static final String PASSWORD = "password";
79-
private static final String SETTINGS_MENU_ITEMS = "settingsMenuItems";
84+
private static final String SETTINGS_MENU_ITEMS = "androidSettingsMenuItems";
8085
private static final String SHOW_ACTION_NAVIGATION_BUTTONS = "showActionNavigationButtons";
86+
private static final String IS_FIRST_PAGE_ALWAYS_SINGLE = "isFirstPageAlwaysSingle";
8187

8288
@NonNull private final PdfActivityConfiguration.Builder configuration;
8389
@Nullable private String password = null;
@@ -86,6 +92,9 @@ class ConfigurationAdapter {
8692
@Nullable HashMap<String, Object> configurationMap) {
8793
this.configuration = new PdfActivityConfiguration.Builder(context);
8894
if (configurationMap != null && !configurationMap.isEmpty()) {
95+
if (containsKeyOfType(configurationMap, PAGE_LAYOUT_MODE, String.class)) {
96+
configurePageLayoutMode((String) configurationMap.get(PAGE_LAYOUT_MODE));
97+
}
8998
if (containsKeyOfType(configurationMap, PAGE_SCROLL_DIRECTION, String.class)) {
9099
configurePageScrollDirection((String) configurationMap.get(PAGE_SCROLL_DIRECTION));
91100
}
@@ -179,6 +188,9 @@ class ConfigurationAdapter {
179188
if (containsKeyOfType(configurationMap, PASSWORD, String.class)) {
180189
this.password = ((String) configurationMap.get(PASSWORD));
181190
}
191+
if (containsKeyOfType(configurationMap, IS_FIRST_PAGE_ALWAYS_SINGLE, Boolean.class)) {
192+
configureFirstPageAlwaysSingle((Boolean) configurationMap.get(IS_FIRST_PAGE_ALWAYS_SINGLE));
193+
}
182194
}
183195
}
184196

@@ -190,6 +202,23 @@ private void configureShowPageNumberOverlay(boolean showPageNumberOverlay) {
190202
}
191203
}
192204

205+
private void configurePageLayoutMode(@NonNull final String pageLayoutMode) {
206+
requireNotNullNotEmpty(pageLayoutMode, "pageLayoutMode");
207+
switch (pageLayoutMode) {
208+
case PAGE_LAYOUT_MODE_AUTO:
209+
configuration.layoutMode(PageLayoutMode.AUTO);
210+
break;
211+
case PAGE_LAYOUT_MODE_SINGLE:
212+
configuration.layoutMode(PageLayoutMode.SINGLE);
213+
break;
214+
case PAGE_LAYOUT_MODE_DOUBLE:
215+
configuration.layoutMode(PageLayoutMode.DOUBLE);
216+
break;
217+
default:
218+
throw new IllegalArgumentException("Undefined page layout mode for " + pageLayoutMode);
219+
}
220+
}
221+
193222
private void configurePageScrollDirection(@NonNull final String pageScrollDirection) {
194223
requireNotNullNotEmpty(pageScrollDirection, "pageScrollDirection");
195224
if (pageScrollDirection.equals(PAGE_SCROLL_DIRECTION_HORIZONTAL)) {
@@ -221,24 +250,22 @@ private void configureStartPage(int startPage) {
221250
private void configureUserInterfaceViewMode(@NonNull String userInterfaceViewMode) {
222251
requireNotNullNotEmpty(userInterfaceViewMode, "userInterfaceViewMode");
223252

224-
UserInterfaceViewMode result;
225253
switch (userInterfaceViewMode) {
226254
case USER_INTERFACE_VIEW_MODE_AUTOMATIC:
227-
result = UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_AUTOMATIC;
255+
configuration.setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_AUTOMATIC);
228256
break;
229257
case USER_INTERFACE_VIEW_MODE_AUTOMATIC_BORDER_PAGES:
230-
result = UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_AUTOMATIC_BORDER_PAGES;
258+
configuration.setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_AUTOMATIC_BORDER_PAGES);
231259
break;
232260
case USER_INTERFACE_VIEW_MODE_ALWAYS_VISIBLE:
233-
result = UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_VISIBLE;
261+
configuration.setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_VISIBLE);
234262
break;
235263
case USER_INTERFACE_VIEW_MODE_ALWAYS_HIDDEN:
236-
result = UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_HIDDEN;
264+
configuration.setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_HIDDEN);
237265
break;
238266
default:
239267
throw new IllegalArgumentException("Undefined user interface view mode for " + userInterfaceViewMode);
240268
}
241-
configuration.setUserInterfaceViewMode(result);
242269
}
243270

244271
private void configureShowSearchAction(boolean showSearchAction) {
@@ -459,6 +486,10 @@ private <T> void configureSettingsMenuItems(@NonNull ArrayList<T> settingsMenuIt
459486
configuration.setSettingsMenuItems(settingsMenuItemTypes);
460487
}
461488

489+
private void configureFirstPageAlwaysSingle(final boolean firstPageAlwaysSingle) {
490+
configuration.firstPageAlwaysSingle(firstPageAlwaysSingle);
491+
}
492+
462493
private <T> boolean containsKeyOfType(@NonNull HashMap<String, Object> configurationMap,
463494
@NonNull String key,
464495
@NonNull Class<T> clazz) {

example/android/gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ org.gradle.jvmargs=-Xmx1536M
22
org.gradle.configureondemand=false
33
android.useAndroidX=true
44
android.enableJetifier=true
5+
android.enableR8=true

example/lib/main.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class _MyAppState extends State<MyApp> {
113113

114114
Pspdfkit.present(tempDocumentPath, {
115115
pageScrollDirection: pageScrollDirectionVertical,
116-
pageScrollContinuous: true,
116+
pageScrollContinuous: false,
117117
fitPageToWidth: true,
118118
androidImmersiveMode: false,
119119
userInterfaceViewMode: userInterfaceViewModeAutomaticBorderPages,
@@ -143,8 +143,11 @@ class _MyAppState extends State<MyApp> {
143143
iOSAllowToolbarTitleChange: false,
144144
toolbarTitle: 'Custom Title',
145145
androidSettingsMenuItems:['theme', 'scrolldirection'],
146+
iOSSettingsMenuItems:['scrollDirection', 'pageTransition', 'appearance', 'brightness', 'pageMode', 'spreadFitting'],
146147
showActionNavigationButtons: false,
147-
iOSShowActionNavigationButtonLabels: false
148+
iOSShowActionNavigationButtonLabels: false,
149+
pageLayoutMode: 'double',
150+
isFirstPageAlwaysSingle: true
148151
});
149152
} on PlatformException catch (e) {
150153
print("Failed to present document: '${e.message}'.");

ios/Classes/PspdfkitPlugin.m

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ - (PSPDFConfiguration *)configuration:(NSDictionary *)dictionary isImageDocument
108108
builder.searchMode = [dictionary[@"inlineSearch"] boolValue] ? PSPDFSearchModeInline : PSPDFSearchModeModal;
109109
builder.userInterfaceViewMode = [self userInterfaceViewMode:dictionary];
110110
builder.thumbnailBarMode = [self thumbnailBarMode:dictionary];
111+
builder.pageMode = [self pageMode:dictionary];
111112

112113
if (dictionary[@"showPageLabels"]) {
113114
builder.pageLabelEnabled = [dictionary[@"showPageLabels"] boolValue];
@@ -131,6 +132,12 @@ - (PSPDFConfiguration *)configuration:(NSDictionary *)dictionary isImageDocument
131132
if (dictionary[@"iOSShowActionNavigationButtonLabels"]) {
132133
builder.showBackForwardActionButtonLabels = [dictionary[@"iOSShowActionNavigationButtonLabels"] boolValue];
133134
}
135+
if (dictionary[@"isFirstPageAlwaysSingle"]) {
136+
builder.firstPageAlwaysSingle = [dictionary[@"isFirstPageAlwaysSingle"] boolValue];
137+
}
138+
if (dictionary[@"iOSSettingsMenuItems"]) {
139+
builder.settingsOptions = [self settingsOptions:dictionary[@"iOSSettingsMenuItems"]];
140+
}
134141
}];
135142
}
136143

@@ -307,6 +314,58 @@ - (PSPDFPageIndex)pageIndex:(NSDictionary *)dictionary {
307314
return (PSPDFPageIndex)[dictionary[@"startPage"] unsignedLongValue];
308315
}
309316

317+
- (PSPDFPageMode)pageMode:(NSDictionary *)dictionary {
318+
PSPDFPageMode pageMode = PSPDFConfiguration.defaultConfiguration.pageMode;
319+
320+
if ((id)dictionary == NSNull.null || !dictionary || dictionary.count == 0) {
321+
return pageMode;
322+
}
323+
324+
NSString *value = dictionary[@"pageLayoutMode"];
325+
if (value) {
326+
if ([value isEqualToString:@"automatic"]) {
327+
pageMode = PSPDFPageModeAutomatic;
328+
} else if ([value isEqualToString:@"single"]) {
329+
pageMode = PSPDFPageModeSingle;
330+
} else if ([value isEqualToString:@"double"]) {
331+
pageMode = PSPDFPageModeDouble;
332+
}
333+
}
334+
return pageMode;
335+
}
336+
337+
- (PSPDFSettingsOptions)settingsOptions:(nullable NSArray <NSString *> *)options {
338+
if ((id)options == NSNull.null || !options || options.count == 0) {
339+
return PSPDFSettingsOptionDefault;
340+
}
341+
342+
PSPDFSettingsOptions finalOptions = 0;
343+
for (NSString *option in options) {
344+
if ([option isEqualToString:@"scrollDirection"]) {
345+
finalOptions |= PSPDFSettingsOptionScrollDirection;
346+
} else if ([option isEqualToString:@"pageTransition"]) {
347+
finalOptions |= PSPDFSettingsOptionPageTransition;
348+
} else if ([option isEqualToString:@"appearance"]) {
349+
finalOptions |= PSPDFSettingsOptionAppearance;
350+
} else if ([option isEqualToString:@"brightness"]) {
351+
finalOptions |= PSPDFSettingsOptionBrightness;
352+
} else if ([option isEqualToString:@"pageMode"]) {
353+
finalOptions |= PSPDFSettingsOptionPageMode;
354+
} else if ([option isEqualToString:@"spreadFitting"]) {
355+
finalOptions |= PSPDFSettingsOptionSpreadFitting;
356+
} else {
357+
NSLog(@"WARNING: '%@' is an invalid settings option. It will be ignored.", option);
358+
}
359+
}
360+
361+
// If no options were passed, we use the default setting options.
362+
if (finalOptions == 0) {
363+
finalOptions = PSPDFSettingsOptionDefault;
364+
}
365+
366+
return finalOptions;
367+
}
368+
310369
- (void)setToolbarTitle:(NSString *)toolbarTitle {
311370
// Early return if the toolbar title is not explicitly set in the configuration dictionary.
312371
if (!toolbarTitle) {

lib/configuration_options.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,14 @@ const String iOSAllowToolbarTitleChange = "allowToolbarTitleChange";
8888

8989
const String toolbarTitle = "toolbarTitle";
9090

91-
const String androidSettingsMenuItems = "settingsMenuItems";
91+
const String androidSettingsMenuItems = "androidSettingsMenuItems";
92+
const String iOSSettingsMenuItems = "iOSSettingsMenuItems";
9293

9394
const String showActionNavigationButtons = "showActionNavigationButtons";
9495
const String iOSShowActionNavigationButtonLabels = "iOSShowActionNavigationButtonLabels";
96+
97+
const String pageLayoutMode = "pageLayoutMode";
98+
const String pageLayoutModeAutomatic = "automatic";
99+
const String pageLayoutModeSingle = "single";
100+
const String pageLayoutModeDouble = "double";
101+
const String isFirstPageAlwaysSingle = "isFirstPageAlwaysSingle";

0 commit comments

Comments
 (0)