/* * Copyright 2019 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import groovy.xml.MarkupBuilder apply plugin: 'com.android.application' def twaManifest = [ applicationId: 'org.jitsi.meet', hostName: 'meet.jit.si', // The domain being opened in the TWA. launchUrl: '/', // The start path for the TWA. Must be relative to the domain. name: 'Jitsi Meet', // The application name. launcherName: 'Jitsi Meet', // The name shown on the Android Launcher. themeColor: '#17A0DB', // The color used for the status bar. navigationColor: '#000000', // The color used for the navigation bar. navigationColorDark: '#000000', // The color used for the dark navbar. navigationDividerColor: '#000000', // The navbar divider color. navigationDividerColorDark: '#000000', // The dark navbar divider color. backgroundColor: '#17A0DB', // The color used for the splash screen background. enableNotifications: false, // Set to true to enable notification delegation. // Every shortcut must include the following fields: // - name: String that will show up in the shortcut. // - short_name: Shorter string used if |name| is too long. // - url: Absolute path of the URL to launch the app with (e.g '/create'). // - icon: Name of the resource in the drawable folder to use as an icon. shortcuts: [], // The duration of fade out animation in milliseconds to be played when removing splash screen. splashScreenFadeOutDuration: 300, generatorApp: 'bubblewrap-cli', // Application that generated the Android Project // The fallback strategy for when Trusted Web Activity is not avilable. Possible values are // 'customtabs' and 'webview'. fallbackType: 'customtabs', enableSiteSettingsShortcut: 'true', ] // Use the number of seconds/10 since Jan 1 2019 as the versionCode. // This lets us upload a new build at most every 10 seconds for the // next ~680 years. // https://stackoverflow.com/a/38643838 def vcode = (int) (((new Date().getTime() / 1000) - 1546297200) / 10) android { compileSdkVersion 29 defaultConfig { applicationId "org.jitsi.meet" minSdkVersion 19 targetSdkVersion 29 versionCode vcode versionName "20.5.0" // The name for the application resValue "string", "appName", twaManifest.name // The name for the application on the Android Launcher resValue "string", "launcherName", twaManifest.launcherName // The URL that will be used when launching the TWA from the Android Launcher def launchUrl = "https://" + twaManifest.hostName + twaManifest.launchUrl resValue "string", "launchUrl", launchUrl // The URL the Web Manifest for the Progressive Web App that the TWA points to. This // is used by Chrome OS to open the Web version of the PWA instead of the TWA, as it // will probably give a better user experience for non-mobile devices. resValue "string", "webManifestUrl", 'https://meet.jit.si/static/pwa/manifest.json' // The hostname is used when building the intent-filter, so the TWA is able to // handle Intents to open https://svgomg.firebaseapp.com. resValue "string", "hostName", twaManifest.hostName // This variable below expresses the relationship between the app and the site, // as documented in the TWA documentation at // https://developers.google.com/web/updates/2017/10/using-twa#set_up_digital_asset_links_in_an_android_app // and is injected into the AndroidManifest.xml resValue "string", "assetStatements", '[{ \\"relation\\": [\\"delegate_permission/common.handle_all_urls\\"],' + '\\"target\\": {\\"namespace\\": \\"web\\", \\"site\\": \\"https://' + twaManifest.hostName + '\\"}}]' // This attribute sets the status bar color for the TWA. It can be either set here or in // `res/values/colors.xml`. Setting in both places is an error and the app will not // compile. If not set, the status bar color defaults to #FFFFFF - white. resValue "color", "colorPrimary", twaManifest.themeColor // This attribute sets the navigation bar color for the TWA. It can be either set here or // in `res/values/colors.xml`. Setting in both places is an error and the app will not // compile. If not set, the navigation bar color defaults to #FFFFFF - white. resValue "color", "navigationColor", twaManifest.navigationColor // This attribute sets the dark navigation bar color for the TWA. It can be either set here // or in `res/values/colors.xml`. Setting in both places is an error and the app will not // compile. If not set, the navigation bar color defaults to #000000 - black. resValue "color", "navigationColorDark", twaManifest.navigationColorDark // This attribute sets the navbar divider color for the TWA. It can be either // set here or in `res/values/colors.xml`. Setting in both places is an error and the app // will not compile. If not set, the divider color defaults to #00000000 - transparent. resValue "color", "navigationDividerColor", twaManifest.navigationDividerColor // This attribute sets the dark navbar divider color for the TWA. It can be either // set here or in `res/values/colors.xml`. Setting in both places is an error and the //app will not compile. If not set, the divider color defaults to #000000 - black. resValue "color", "navigationDividerColorDark", twaManifest.navigationDividerColorDark // Sets the color for the background used for the splash screen when launching the // Trusted Web Activity. resValue "color", "backgroundColor", twaManifest.backgroundColor // Defines a provider authority fot the Splash Screen resValue "string", "providerAuthority", twaManifest.applicationId + '.fileprovider' // The enableNotification resource is used to enable or disable the // TrustedWebActivityService, by changing the android:enabled and android:exported // attributes resValue "bool", "enableNotification", twaManifest.enableNotifications.toString() twaManifest.shortcuts.eachWithIndex { shortcut, index -> resValue "string", "shortcut_name_$index", "$shortcut.name" resValue "string", "shortcut_short_name_$index", "$shortcut.short_name" } // The splashScreenFadeOutDuration resource is used to set the duration of fade out animation in milliseconds // to be played when removing splash screen. The default is 0 (no animation). resValue "integer", "splashScreenFadeOutDuration", twaManifest.splashScreenFadeOutDuration.toString() resValue "string", "generatorApp", twaManifest.generatorApp resValue "string", "fallbackType", twaManifest.fallbackType resValue "bool", "enableSiteSettingsShortcut", twaManifest.enableSiteSettingsShortcut } buildTypes { release { minifyEnabled true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } task generateShorcutsFile { assert twaManifest.shortcuts.size() < 5, "You can have at most 4 shortcuts." twaManifest.shortcuts.eachWithIndex { s, i -> assert s.name != null, 'Missing `name` in shortcut #' + i assert s.short_name != null, 'Missing `short_name` in shortcut #' + i assert s.url != null, 'Missing `icon` in shortcut #' + i assert s.icon != null, 'Missing `url` in shortcut #' + i } def shortcutsFile = new File("$projectDir/src/main/res/xml", "shortcuts.xml") def xmlWriter = new StringWriter() def xmlMarkup = new MarkupBuilder(new IndentPrinter(xmlWriter, " ", true)) xmlMarkup .'shortcuts'('xmlns:android': 'http://schemas.android.com/apk/res/android') { twaManifest.shortcuts.eachWithIndex { s, i -> 'shortcut'( 'android:shortcutId': 'shortcut' + i, 'android:enabled': 'true', 'android:icon': '@drawable/' + s.icon, 'android:shortcutShortLabel': '@string/shortcut_short_name_' + i, 'android:shortcutLongLabel': '@string/shortcut_name_' + i) { 'intent'( 'android:action': 'android.intent.action.MAIN', 'android:targetPackage': twaManifest.applicationId, 'android:targetClass': twaManifest.applicationId + '.LauncherActivity', 'android:data': s.url) 'categories'('android:name': 'android.intent.category.LAUNCHER') } } } shortcutsFile.text = xmlWriter.toString() + '\n' } preBuild.dependsOn(generateShorcutsFile) repositories { } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.0.0' }