Skip to content

Commit

Permalink
feat(android): replace Support libraries with AndroidX (#11428)
Browse files Browse the repository at this point in the history
* feat(android): migrate to AndroidX

* fix(android): remove shift-mode hack

* chore(android): finished migration to AndroidX

* feat(android): added "gradle.properties" support to apps

- TIMOB-27696: Add ability to add your own "gradle.properties" file to project's "./platform/android" directory.

Co-authored-by: Hans Knöchel <hansemannn@users.noreply.github.com>
Co-authored-by: Gary Mathews <contact@garymathews.com>
  • Loading branch information
3 people authored and ssjsamir committed Jan 15, 2020
1 parent 821ca06 commit 0558c28
Show file tree
Hide file tree
Showing 64 changed files with 211 additions and 251 deletions.
2 changes: 1 addition & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,5 @@ dependencies {
// exclude group: 'com.google.android.gms'
}

implementation "com.android.support:appcompat-v7:${project.ext.tiSupportLibVersion}"
implementation "androidx.appcompat:appcompat:${project.ext.tiAndroidXAppCompatLibVersion}"
}
20 changes: 20 additions & 0 deletions android/cli/commands/_build.js
Original file line number Diff line number Diff line change
Expand Up @@ -2259,6 +2259,26 @@ AndroidBuilder.prototype.generateRootProjectFiles = async function generateRootP
gradlew.logger = this.logger;
await gradlew.installTemplate(path.join(this.platformPath, 'templates', 'gradle'));

// Create a "gradle.properties" file. Will add network proxy settings if needed.
// Note: Enable Jetifier to replace all Google Support library references with AndroidX in all pre-built JARs.
// This is needed because using both libraries will cause class name collisions, causing a build failure.
const gradleProperties = await gradlew.fetchDefaultGradleProperties();
gradleProperties.push({ key: 'android.useAndroidX', value: 'true' });
gradleProperties.push({ key: 'android.enableJetifier', value: 'true' });
await gradlew.writeGradlePropertiesFile(gradleProperties);

// Copy optional "gradle.properties" file contents from Titainum project to the above generated file.
// These properties must be copied to the end of the file so that they can override Titanium's default properties.
const customGradlePropertiesFilePath = path.join(this.projectDir, 'platform', 'android', 'gradle.properties');
if (await fs.exists(customGradlePropertiesFilePath)) {
const targetGradlePropertiesFilePath = path.join(this.buildDir, 'gradle.properties');
const fileContent = await fs.readFile(customGradlePropertiesFilePath);
await fs.appendFile(targetGradlePropertiesFilePath,
'\n\n'
+ '# The below was copied from project file: ./platform/android/gradle.properties\n'
+ fileContent.toString() + '\n');
}

// Create a "local.properties" file providing a path to the Android SDK/NDK directories.
const androidNdkPath = this.androidInfo.ndk ? this.androidInfo.ndk.path : null;
await gradlew.writeLocalPropertiesFile(this.androidInfo.sdk.path, androidNdkPath);
Expand Down
4 changes: 3 additions & 1 deletion android/cli/commands/_buildModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -534,11 +534,13 @@ AndroidModuleBuilder.prototype.generateRootProjectFiles = async function generat
this.logger.info(__('Generating root project files'));

// Copy our SDK's gradle files to the build directory. (Includes "gradlew" scripts and "gradle" directory tree.)
// The below install method will also generate a "gradle.properties" file.
const gradlew = new GradleWrapper(this.buildDir);
gradlew.logger = this.logger;
await gradlew.installTemplate(path.join(this.platformPath, 'templates', 'gradle'));

// Create a "gradle.properties" file. Will add network proxy settings if needed.
await gradlew.writeDefaultGradlePropertiesFile();

// Create a "local.properties" file providing a path to the Android SDK/NDK directories.
await gradlew.writeLocalPropertiesFile(this.androidInfo.sdk.path, this.androidInfo.ndk.path);

Expand Down
59 changes: 46 additions & 13 deletions android/cli/lib/gradle-wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,19 @@ const url = require('url');
*/
const isWindows = (process.platform === 'win32');

/**
* Array of dictionary objects describing what is to be written to a Gradle/Java style properties file.
* Order matters. First array entry is written to file first. Last array entry is written last.
*
* Null or empty entries will write empty lines to file.
*
* An entry with a "comment" property will write a #-prefixed string to file.
*
* An entry having "key" and "value" properties will be written to file as "myKey=myValue".
* You can set a "key" without a "value" which will write "myKey=" to file.
* @typedef {[{ comment: {String}, key: {String}, value: {String} }]} GradlePropertiesFileEntries
*/

/** Class used to install, configure, and run gradle in a root project directory. */
class GradleWrapper {
/**
Expand Down Expand Up @@ -203,7 +216,15 @@ class GradleWrapper {
await fs.copy(templateDirPath, destinationDirPath);
await fs.chmod(path.join(destinationDirPath, 'gradlew'), 0o755);
await fs.chmod(path.join(destinationDirPath, 'gradlew.bat'), 0o755);
}

/**
* Creates an array of property entries to be written to a "gradle.properties" file.
* Provides default property key/value entries such as network proxy settings.
* @returns {Promise<GradlePropertiesFileEntries>}
* Returns an array of property file entries to be written to a "gradle.properties" file.
*/
async fetchDefaultGradleProperties() {
// Fetch proxy server information, if configured.
let proxyUrl = null;
await new Promise((resolve) => {
Expand All @@ -223,7 +244,7 @@ class GradleWrapper {
});
});

// Write a "gradle.properties" file.
// Create an array of Java property entries and return it.
const properties = [ { comment: '# This file was generated by Titanium\'s build tools.' } ];
if (proxyUrl) {
if (proxyUrl.hostname) {
Expand All @@ -244,7 +265,27 @@ class GradleWrapper {
}
}
}
await writeJavaPropertiesFile(path.join(destinationDirPath, 'gradle.properties'), properties);
return properties;
}

/**
* Creates a "gradle.properties" file at the gradle project's root location,
* configuring it with default properties such as network proxy settings.
*/
async writeDefaultGradlePropertiesFile() {
const properties = await this.fetchDefaultGradleProperties();
await this.writeGradlePropertiesFile(properties);
}

/**
* Creates a "gradle.properties" file at the gradle project's root location,
* writing the given properties key/value entries to it.
* @param {GradlePropertiesFileEntries} [properties]
* Array of properties to be written to file. Can be null/undefined, in which case an empty file will be created.
*/
async writeGradlePropertiesFile(properties) {
const filePath = path.join(this._gradlewDirPath, 'gradle.properties');
await writeJavaPropertiesFile(filePath, properties);
}

/**
Expand Down Expand Up @@ -284,17 +325,9 @@ function isNonEmptyString(value) {
* If referenced file already exists, then it will be overwritten.
* @param {String} filePath
* Path to the file to be written. Cannot be null/undefined or else an exception will be thrown.
* @param {[{ comment: {String}, key: {String}, value: {String} }]} properties
* Array of property dictionary objects describing what to be written to file.
* Order matters. First array entry is written to file first. Last array entry is written last.
* Given array can be null/undefined, in which case an empty file will be created.
*
* Null or empty entries will write empty lines to file.
*
* An entry with a "comment" property will write a #-prefixed string to file.
*
* An entry having "key" and "value" properties will be written to file as "myKey=myValue".
* You can set a "key" without a "value" which will write "myKey=" to file.
* @param {GradlePropertiesFileEntries} [properties]
* An array of properties to be written to file.
* Can be null/undefined, in which case an empty file will be created.
*/
async function writeJavaPropertiesFile(filePath, properties) {
// Validate arguments.
Expand Down
8 changes: 0 additions & 8 deletions android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,3 @@ org.gradle.jvmargs=-Xmx1536m
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
#org.gradle.parallel=true

# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
#android.useAndroidX=true

# Automatically convert third-party libraries to use AndroidX
#android.enableJetifier=true
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.ActionBar;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.appcompat.app.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import ti.modules.titanium.android.AndroidModule;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationCompat.BigPictureStyle;
import androidx.core.app.NotificationCompat.BigPictureStyle;

@Kroll.proxy(creatableInModule = AndroidModule.class, propertyAccessors = { TiC.PROPERTY_DECODE_RETRIES })
public class BigPictureStyleProxy extends StyleProxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.util.TiConvert;

import android.support.v4.app.NotificationCompat.BigTextStyle;
import androidx.core.app.NotificationCompat.BigTextStyle;

@Kroll.proxy(creatableInModule = AndroidModule.class)
public class BigTextStyleProxy extends StyleProxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.common.Log;

import ti.modules.titanium.android.AndroidModule;
Expand All @@ -26,7 +24,7 @@
import android.os.Build;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.support.v4.app.NotificationManagerCompat;
import androidx.core.app.NotificationManagerCompat;

import java.util.HashMap;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.Builder;
import android.os.Build;

import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.annotations.Kroll;

import android.support.v4.app.NotificationCompat.Style;
import androidx.core.app.NotificationCompat.Style;

@Kroll.proxy
abstract class StyleProxy extends KrollProxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import android.os.Build;
import android.service.quicksettings.TileService;
import android.support.annotation.RequiresApi;
import androidx.annotation.RequiresApi;
import org.appcelerator.kroll.KrollRuntime;
import org.appcelerator.kroll.util.KrollAssetHelper;
import org.appcelerator.titanium.TiC;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,23 @@
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.KrollRuntime;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
import org.appcelerator.kroll.util.KrollAssetHelper;
import org.appcelerator.titanium.ITiAppInfo;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.titanium.TiBaseActivity;
import org.appcelerator.titanium.TiRootActivity;
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.util.TiPlatformHelper;
import org.appcelerator.titanium.util.TiSensorHelper;

import android.app.Application;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.provider.Settings;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v4.view.accessibility.AccessibilityManagerCompat;
import android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat;
import androidx.core.view.accessibility.AccessibilityEventCompat;
import androidx.core.view.accessibility.AccessibilityManagerCompat;
import androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import androidx.appcompat.app.ActionBar;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Surface;
Expand Down
6 changes: 3 additions & 3 deletions android/modules/ui/res/layout/titanium_ui_drawer_layout.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<android.support.v4.widget.DrawerLayout
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
Expand All @@ -9,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.Toolbar
<androidx.appcompat.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout_toolbar"
android:visibility="gone"
Expand All @@ -23,4 +23,4 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>
2 changes: 1 addition & 1 deletion android/modules/ui/res/layout/titanium_ui_switchcompat.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/titanium_ui_switchcompat"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
Expand Down
2 changes: 1 addition & 1 deletion android/modules/ui/res/layout/titanium_ui_toolbar.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
<androidx.appcompat.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:visibility="gone"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:scrollbars="horizontal"/>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:scrollbars="vertical"/>
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@
import android.content.Intent;
import android.os.Message;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.LayoutInflater;

// clang-format off
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package ti.modules.titanium.ui;

import android.app.Activity;
import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.proxy.TiToolbarProxy;
import org.appcelerator.titanium.view.TiUIView;
import ti.modules.titanium.ui.android.AndroidModule;

import ti.modules.titanium.ui.widget.TiToolbar;
// clang-format off
@Kroll.proxy(creatableInModule = UIModule.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,12 @@
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.transition.ChangeBounds;
import android.transition.ChangeClipBounds;
import android.transition.ChangeImageTransform;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.text.util.Linkify;
import android.view.Gravity;
import android.support.v4.view.GravityCompat;
import androidx.core.view.GravityCompat;
import android.view.WindowManager;
import android.webkit.WebSettings;
// clang-format off
Expand Down
Loading

0 comments on commit 0558c28

Please sign in to comment.