summaryrefslogtreecommitdiffstats
path: root/android/source/build.gradle
blob: 8843330b7ba549814aedb40c5cf5ef38f6b0eee0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
apply plugin: 'com.android.application'
// buildhost settings - paths and the like
apply from: 'liboSettings.gradle'

allprojects {
    repositories {
        mavenCentral()
        maven {
            url "https://ipv6.repo1.maven.org/maven2"
        }
        google()
    }
}
//build-time dependencies - android plugin for gradle
buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://ipv6.repo1.maven.org/maven2"
        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.2.0'
    }
}

// compile-time dependencies
dependencies {
    implementation fileTree(dir: "${liboInstdir}/${liboUREJavaFolder}", include: [
            "java_uno.jar",
            "libreoffice.jar",
            "unoloader.jar"
    ])
    implementation 'com.google.android.material:material:1.10.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation "androidx.multidex:multidex:2.0.1"
}

android {
    namespace 'org.libreoffice'
    compileSdk 34
    // uses non-conventional source layout, so need to reconfigure accordingly
    // ToDo move to conventional layout, so stuff can be stripped down.
    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.assets.srcDirs = ['assets']
        main.res.srcDirs = ['res', 'res_generated']
        main.java.srcDirs = ['../Bootstrap/src', 'src/java']
        main.jniLibs.srcDirs = ["${liboJniLibsdir}"]
        // the configuration data that might be stripped or not
        fullUI.assets.srcDirs 'assets_fullUI'
        strippedUI.assets.srcDirs 'assets_strippedUI'
        strippedUIEditing.assets.srcDirs 'assets_strippedUI'
    }
    defaultConfig {
        // minSdkVersion is set in liboSettings.gradle
        targetSdkVersion 34
        // multidex needed when > 65,536 methods referenced with minSdKVersion < 21
        // s. https://developer.android.com/studio/build/multidex
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        debug {
            // make android studio happy...
            jniDebuggable true
            // would work just fine with external, but setting emulator up is a little more work
            manifestPlaceholders = [installLocation: "auto"]
        }
        release {
            manifestPlaceholders = [installLocation: "preferExternal"]
        }
    }

    flavorDimensions "default"
    productFlavors {
        strippedUI {
            dimension "default"
            buildConfigField 'boolean', 'ALLOW_EDITING', 'false'
        }
        strippedUIEditing {
            dimension "default"
            buildConfigField 'boolean', 'ALLOW_EDITING', 'true'
        }
        fullUI.dimension "default"
    }
    lint {
        // don't error-out on missing translations
        warning 'MissingTranslation'
    }
}

// show warnings about use of deprecated API
tasks.withType(JavaCompile).configureEach {
    options.deprecation = true
}

/* remark inherited from makefile:
Then "assets". Let the directory structure under assets mimic
that under solver for now.

Please note that I have no idea what all of this is really necessary and for
much of this stuff being copied, no idea whether it makes any sense at all.
Much of this is copy-pasted from android/qa/sc/Makefile (where a couple of
unit tests for sc are built, and those do seem to mostly work) and
android/qa/desktop/Makefile (mmeeks's desktop demo, also works to some
extent)
 */

// Assets that are unpacked at run-time into the app's data directory. These
// are files read by non-LO code, fontconfig and freetype for now, that doesn't
// understand "/assets" paths.
task copyUnpackAssets(type: Copy) {
    description "copies assets that need to be extracted on the device"
    into 'assets/unpack'
    into('program') {
        from("${liboInstdir}/${liboEtcFolder}/types") {
            includes = [
                    "offapi.rdb",
                    "oovbaapi.rdb"
            ]
        }
        from("${liboInstdir}/${liboUreMiscFolder}") {
            includes = ["types.rdb"]
            rename 'types.rdb', 'udkapi.rdb'
        }
    }
    into('user/fonts') {
        from "${liboInstdir}/share/fonts/truetype"
        // Note: restrict list of fonts due to size considerations - no technical reason anymore
        // ToDo: fonts would be good candidate for using Expansion Files instead
        includes = [
                "Liberation*.ttf",
                "Caladea-*.ttf",
                "Carlito-*.ttf",
                "Gen*.ttf",
                "opens___.ttf"
        ]
    }
    into('etc/fonts') {
        from "./"
        includes = ['fonts.conf']
        filter {
            String line ->
                line.replaceAll(
                        '@@APPLICATION_ID@@', new String("${android.defaultConfig.applicationId}")
                )
        }
    }
}

task copyAssets(type: Copy) {
    description "copies assets that can be accessed within the installed apk"
    into 'assets'

    // include icons, Impress styles and required .ui files
    into ('share') {
        into ('config') {
            from ("${liboInstdir}/share/config")
            includes = ['images_**.zip',
                        '**/simpress/**.xml',
                        '**/annotation.ui',
                        '**/hfmenubutton.ui',
                        '**/inforeadonlydialog.ui',
                        '**/pbmenubutton.ui',
                        '**/scrollbars.ui',
                        '**/tabbuttons.ui',
                        '**/tabviewbar.ui'
                        ]
        }
    }

    into('program') {
        from "${liboInstdir}/program"
        includes = ['services.rdb', 'services/services.rdb']

        into('resource') {
            from "${liboInstdir}/${liboSharedResFolder}"
            includes = ['*en-US.res']
        }
    }
    into('share') {
        from("${liboInstdir}/share") {
            // Filter data is needed by e.g. the drawingML preset shape import.
            includes = ['registry/**', 'filter/**']
            // those two get processed by mobile-config.py
            excludes = ['registry/main.xcd', 'registry/res/registry_en-US.xcd']
        }
        // separate data files for Chinese and Japanese
        from("${liboWorkdir}/CustomTarget/i18npool/breakiterator/") {
            include '*.data'
        }
    }
}

task copyAppResources(type: Copy) {
    description "copies documents to make them available as app resources"
    into 'res_generated/raw'
    from("${liboInstdir}") {
        includes = ["LICENSE", "NOTICE"]
        rename "LICENSE", "license.txt"
        rename "NOTICE", "notice.txt"
    }
}

task createFullConfig(type: Copy) {
    // grab dir to clear whole hierarchy on clean target
    outputs.dir "assets_fullUI"
    into 'assets_fullUI/share/config/soffice.cfg'
    from "${liboInstdir}/share/config/soffice.cfg"
}

task createStrippedConfig {
    def preserveDir = file("assets_strippedUI/share/config/soffice.cfg/empty")
    outputs.dir "assets_strippedUI"
    outputs.dir "assets_strippedUI/share/registry/res"
    outputs.file preserveDir

    doLast {
        file('assets_strippedUI/share/registry/res').mkdirs()
        file("assets_strippedUI/share/config/soffice.cfg").mkdirs()
        // just empty file
        preserveDir.text = ""
    }
}


task createStrippedConfigMain(type: Exec) {
    dependsOn 'createStrippedConfig'
    inputs.files "${liboInstdir}/share/registry/main.xcd", "${liboSrcRoot}/android/mobile-config.py"
    outputs.file "assets_strippedUI/share/registry/main.xcd"
    executable "${liboSrcRoot}/android/mobile-config.py"
    args = ["${liboInstdir}/share/registry/main.xcd", "assets_strippedUI/share/registry/main.xcd"]
}

task createStrippedConfigRegistry(type: Exec) {
    dependsOn 'createStrippedConfig'
    inputs.files "${liboInstdir}/share/registry/res/registry_en-US.xcd", "${liboSrcRoot}/android/mobile-config.py"
    outputs.file "assets_strippedUI/share/registry/res/registry_en-US.xcd"
    executable "${liboSrcRoot}/android/mobile-config.py"
    args = ["${liboInstdir}/share/registry/res/registry_en-US.xcd", "assets_strippedUI/share/registry/res/registry_en-US.xcd"]
    doFirst {
        file('assets_strippedUI/share/registry/res').mkdirs()
    }
}

task createRCfiles {
    inputs.file "liboSettings.gradle"
    dependsOn copyUnpackAssets, copyAssets
    def sofficerc     = file('assets/unpack/program/sofficerc')
    def fundamentalrc = file('assets/program/fundamentalrc')
    def bootstraprc   = file('assets/program/bootstraprc')
    def unorc         = file('assets/program/unorc')
    def versionrc     = file('assets/program/versionrc')

    outputs.files sofficerc, fundamentalrc, unorc, bootstraprc, versionrc

    doLast {
        sofficerc.text = '''\
            [Bootstrap]
            Logo=1
            NativeProgress=1
            URE_BOOTSTRAP=file:///assets/program/fundamentalrc
            HOME=$APP_DATA_DIR/cache
            OSL_SOCKET_PATH=$APP_DATA_DIR/cache
            '''.stripIndent()

        fundamentalrc.text =  '''\
            [Bootstrap]
            LO_LIB_DIR=file://$APP_DATA_DIR/lib/
            BRAND_BASE_DIR=file:///assets
            BRAND_SHARE_SUBDIR=share
            CONFIGURATION_LAYERS=xcsxcu:${BRAND_BASE_DIR}/share/registry res:${BRAND_BASE_DIR}/share/registry
            URE_BIN_DIR=file:///assets/ure/bin/dir/nothing-here/we-can/exec-anyway
            '''.stripIndent()

        bootstraprc.text =  '''\
            [Bootstrap]
            InstallMode=<installmode>
            ProductKey=LibreOffice '''+ "${liboVersionMajor}.${liboVersionMinor}" + '''
            UserInstallation=file://$APP_DATA_DIR
            '''.stripIndent()

        unorc.text = '''\
            [Bootstrap]
            URE_INTERNAL_LIB_DIR=file://$APP_DATA_DIR/lib/
            UNO_TYPES=file://$APP_DATA_DIR/program/udkapi.rdb file://$APP_DATA_DIR/program/offapi.rdb file://$APP_DATA_DIR/program/oovbaapi.rdb
            UNO_SERVICES=file:///assets/program/services.rdb file:///assets/program/services/services.rdb
            '''.stripIndent()

        versionrc.text = '''\
            [Version]
            AllLanguages=en-US
            buildid=''' + "${liboGitFullCommit}" + '''
            ReferenceOOoMajorMinor=4.1
            '''.stripIndent()
    }
}

// creating the UI stuff is cheap, don't bother only applying it for the flavor...
preBuild.dependsOn 'createRCfiles',
        'createStrippedConfigMain',
        'createStrippedConfigRegistry',
        'createFullConfig',
        'copyAppResources'

clean.dependsOn 'cleanCopyAssets',
        'cleanCreateStrippedConfig',
        'cleanCreateFullConfig'