Socket
Socket
Sign inDemoInstall

nativescript-plugin-firebase

Package Overview
Dependencies
Maintainers
1
Versions
155
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nativescript-plugin-firebase - npm Package Compare versions

Comparing version 3.0.1 to 3.1.0

es6-promise.d.ts

15

firebase-common.d.ts

@@ -14,3 +14,16 @@ declare module "nativescript-plugin-firebase" {

*/
PASSWORD
PASSWORD,
/**
* This requires you to pass either an authentication token generated by your backend server
* or the tokenProviderFn function that returns a promise to provide the token.
* See: https://firebase.google.com/docs/auth/server
*/
CUSTOM,
/**
* This requires you to setup Facebook Auth in the Firebase console,
* as well as uncommenting the SDK includes in include.gradle (Android) and Podfile (iOS).
*
* Note that this works well on iOS, but Android is work in progress.
*/
FACEBOOK
}

@@ -17,0 +30,0 @@

@@ -5,3 +5,5 @@ var firebase = {};

ANONYMOUS: "anonymous",
PASSWORD: "password"
PASSWORD: "password",
CUSTOM: "custom",
FACEBOOK: "facebook"
};

@@ -29,2 +31,38 @@

firebase.authStateListeners = [];
firebase.addAuthStateListener = function(listener) {
if (firebase.authStateListeners.indexOf(listener) === -1) {
firebase.authStateListeners.push(listener);
}
return true;
};
firebase.removeAuthStateListener = function(listener) {
var index = firebase.authStateListeners.indexOf(listener);
if (index >= 0) {
firebase.authStateListeners.splice(index, 1);
} else {
return false;
}
};
firebase.hasAuthStateListener = function(listener) {
return firebase.authStateListeners.indexOf(listener) >= 0;
};
firebase.notifyAuthStateListeners = function(data) {
firebase.authStateListeners.forEach(function (listener) {
try {
if (listener.thisArg) {
listener.onAuthStateChanged.apply(thisArg, data);
} else {
listener.onAuthStateChanged(data);
}
} catch (ex) {
console.error("Firebase AuthStateListener failed to trigger", listener, ex);
}
});
};
module.exports = firebase;

250

firebase.android.js

@@ -85,2 +85,4 @@ var appModule = require("application");

firebase.authStateListener = null;
firebase.init = function (arg) {

@@ -90,3 +92,2 @@ return new Promise(function (resolve, reject) {

var fDatabase = com.google.firebase.database.FirebaseDatabase;
// console.log("fDatabase: " + fDatabase);
if (arg.persist) {

@@ -100,2 +101,33 @@ fDatabase.getInstance().setPersistenceEnabled(true);

var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
if (arg.onAuthStateChanged) {
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
onAuthStateChanged: function (fbAuth) {
console.log("--------- auth change (1), user: " + user);
var user = fbAuth.getCurrentUser();
arg.onAuthStateChanged({
loggedIn: user !== null,
user: toLoginResult(user)
});
}
});
firebaseAuth.addAuthStateListener(firebase.authStateListener);
}
// Listen to auth state changes
if (!firebase.authStateListener) {
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
onAuthStateChanged: function (fbAuth) {
console.log("--------- auth change (2), user: " + user);
var user = fbAuth.getCurrentUser();
firebase.notifyAuthStateListeners({
loggedIn: user !== null,
user: toLoginResult(user)
});
}
});
firebaseAuth.addAuthStateListener(firebase.authStateListener);
}
resolve(instance);

@@ -109,2 +141,30 @@ } catch (ex) {

firebase.getCurrentUser = function (arg) {
return new Promise(function (resolve, reject) {
try {
if (instance === null) {
reject("Run init() first!");
return;
}
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
var user = firebaseAuth.getCurrentUser();
console.log("getCurrentUser: " + user);
if (user !== null) {
resolve({
uid: user.getUid(),
name: user.getDisplayName(),
email: user.getEmail(),
profileImageURL: user.getPhotoUrl()
});
} else {
reject();
}
} catch (ex) {
console.log("Error in firebase.getCurrentUser: " + ex);
reject(ex);
}
});
};
firebase.logout = function (arg) {

@@ -122,49 +182,36 @@ return new Promise(function (resolve, reject) {

firebase.authStateListener = null;
function toLoginResult(user) {
if (user === null) {
return false;
}
/*
var providerData = user.getProviderData();
for (var i = 0; i < providerData.size(); i++) {
var info = providerData.get(i);
console.log("--- userInfo - provider: " + info.getProviderId());
}
*/
return {
uid: user.getUid(),
name: user.getDisplayName(),
email: user.getEmail(),
// expiresAtUnixEpochSeconds: authData.getExpires(),
profileImageURL: user.getPhotoUrl()
// token: user.getToken() // can be used to auth with a backend server
};
}
firebase.login = function (arg) {
return new Promise(function (resolve, reject) {
try {
/*
var authorizer = new com.google.firebase.database.DatabaseReference.AuthResultHandler({
onAuthenticated: function (authData) {
resolve({
uid: authData.getUid(),
provider: authData.getProvider(),
expiresAtUnixEpochSeconds: authData.getExpires(),
profileImageURL: authData.getProviderData().get("profileImageURL"),
token: authData.getToken()
});
},
onAuthenticationError: function (databaseError) {
reject(databaseError.getMessage());
}
});
*/
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
if (firebase.authStateListener !== null) {
firebaseAuth.removeAuthStateListener(firebase.authStateListener);
}
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
onAuthStateChanged: function (fbAuth) {
console.log("--- auth state changed: " + fbAuth);
var user = fbAuth.getCurrentUser();
console.log("--- user: " + user);
if (user !== null) {
// signed in
resolve({
uid: user.getUid(),
name: user.getDisplayName(),
email: user.getEmail(),
// TODO add these properties, see https://firebase.google.com/docs/auth/android/manage-users#get_a_users_profile
// provider: authData.getProvider(),
// expiresAtUnixEpochSeconds: authData.getExpires(),
profileImageURL: user.getPhotoUrl()
// token: user.getToken() // can be used to auth with a backend server
});
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
onComplete: function (task) {
// alert("login task: " + task.isSuccessful());
if (!task.isSuccessful()) {
reject("Logging in the user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException()));
} else {
// reject("Logging in the user failed");
var user = task.getResult().getUser();
resolve(toLoginResult(user));
}

@@ -174,11 +221,10 @@ }

firebaseAuth.addAuthStateListener(firebase.authStateListener);
if (arg.type === firebase.LoginType.ANONYMOUS) {
var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({
onFailure: function (throwable) {
reject("Anonymous login failed with message: " + throwable.getMessage());
}
});
firebaseAuth.signInAnonymously().addOnFailureListener(onFailureListener);
// var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({
// onFailure: function (throwable) {
// reject("Anonymous login failed with message: " + throwable.getMessage());
// }
// });
// firebaseAuth.signInAnonymously().addOnFailureListener(onFailureListener);
firebaseAuth.signInAnonymously().addOnCompleteListener(onCompleteListener);
} else if (arg.type === firebase.LoginType.PASSWORD) {

@@ -188,13 +234,45 @@ if (!arg.email || !arg.password) {

} else {
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
onComplete: function (task) {
if (!task.isSuccessful()) {
reject("Logging in the user failed");
} else {
// the AuthStateListener.onAuthStateChanged callback will resolve the promise
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
}
} else if (arg.type === firebase.LoginType.CUSTOM) {
if (!arg.token && !arg.tokenProviderFn) {
reject("Auth type custom requires a token or a tokenProviderFn argument");
} else if (arg.token) {
firebaseAuth.signInWithCustomToken(arg.token).addOnCompleteListener(onCompleteListener);
} else if (arg.tokenProviderFn) {
arg.tokenProviderFn()
.then(
function (token) {
firebaseAuth.signInWithCustomToken(arg.token).addOnCompleteListener(onCompleteListener);
},
function (error) {
reject(error);
}
);
}
} else if (arg.type === firebase.LoginType.FACEBOOK) {
if (typeof(com.facebook) === "undefined") {
reject("Facebook SDK not installed - see Podfile");
return;
}
// TODO see https://firebase.google.com/docs/auth/android/facebook-login#authenticate_with_firebase
var fbLoginManager = com.facebook.login.LoginManager.getInstance();
var callbackManager = com.facebook.CallbackManager.Factory.create();
fbLoginManager.registerCallback(
callbackManager,
new com.facebook.FacebookCallback({
onSuccess: function (loginResult) {
console.log("------------- fb callback");
console.log("------------- fb loginResult " + loginResult);
}
});
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
}
})
);
var permissions = ["public_profile", "email"];
var activity = appModule.android.foregroundActivity;
fbLoginManager.logInWithReadPermissions(foregroundActivity, permissions);
} else {

@@ -259,3 +337,3 @@ reject ("Unsupported auth type: " + arg.type);

if (user === null) {
reject("Please log the user in first");
reject("no current user");
} else {

@@ -282,32 +360,44 @@ user.updatePassword(arg.newPassword).addOnCompleteListener(onCompleteListener);

onComplete: function (task) {
// see https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth#public-methods
if (!task.isSuccessful()) {
reject("Creating a user failed");
reject("Creating a user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException()));
} else {
// the AuthStateListener.onAuthStateChanged callback will resolve the promise
var user = task.getResult().getUser();
resolve(toLoginResult(user));
}
}
});
firebaseAuth.createUserWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
}
} catch (ex) {
console.log("Error in firebase.createUser: " + ex);
reject(ex);
}
});
};
if (firebase.authStateListener !== null) {
firebaseAuth.removeAuthStateListener(firebase.authStateListener);
}
firebase.deleteUser = function (arg) {
return new Promise(function (resolve, reject) {
try {
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
var user = firebaseAuth.getCurrentUser();
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
onAuthStateChanged: function (fbAuth) {
console.log("--- auth state changed: " + fbAuth);
var user = fbAuth.getCurrentUser();
if (user !== null) {
// signed in
resolve({
key: user.getUid()
});
}
if (user === null) {
reject("no current user");
return;
}
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
onComplete: function (task) {
if (!task.isSuccessful()) {
reject("Deleting a user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException()));
} else {
resolve();
}
});
}
});
firebaseAuth.addAuthStateListener(firebase.authStateListener);
firebaseAuth.createUserWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
}
user.delete().addOnCompleteListener(onCompleteListener);
} catch (ex) {
console.log("Error in firebase.createUser: " + ex);
console.log("Error in firebase.deleteUser: " + ex);
reject(ex);

@@ -314,0 +404,0 @@ }

@@ -16,2 +16,6 @@ /// <reference path="firebase-common.d.ts"/>

persist?: boolean;
/**
* Get notified when fi the user is logged in.
*/
onAuthStateChange?: AuthStateChangeListener
}

@@ -66,2 +70,14 @@

password?: string;
/**
* The JSON Web Token (JWT) to use for authentication.
* Use with LoginType.CUSTOM
* See: https://firebase.google.com/docs/auth/server
*/
token?: string;
/**
* A function that returns a promise with the JSON Web Token (JWT) to use for authentication.
* Use with LoginType.CUSTOM
* See: https://firebase.google.com/docs/auth/server
*/
tokenProviderFn?: () => Promise<String>;
}

@@ -128,2 +144,12 @@

export interface AuthStateData {
loggedIn?: boolean;
user?: LoginResult;
}
export interface AuthStateChangeListener {
onAuthStateChanged: (data: AuthStateData) => void;
thisArg?: any;
}
export function init(options: InitOptions): Promise<any>;

@@ -133,2 +159,3 @@ export function login(options: LoginOptions): Promise<LoginResult>;

export function createUser(options: CreateUserOptions): Promise<CreateUserResult>;
export function deleteUser(): Promise<any>;
export function resetPassword(options: ResetPasswordOptions): Promise<any>;

@@ -143,2 +170,5 @@ export function changePassword(options: ChangePasswordOptions): Promise<any>;

export function addValueEventListener(onValueEvent: (data: FBData) => void, path: string): Promise<any>;
export function addAuthStateListener(listener: AuthStateChangeListener): boolean;
export function removeAuthStateListener(listener: AuthStateChangeListener): boolean;
export function hasAuthStateListener(listener: AuthStateChangeListener): boolean;
}
var firebase = require("./firebase-common");
var types = require("utils/types");
var frame = require("ui/frame");

@@ -55,2 +56,4 @@ firebase.toJsObject = function(objCObj) {

firebase.authStateListener = null;
firebase.init = function (arg) {

@@ -69,2 +72,30 @@ return new Promise(function (resolve, reject) {

if (arg.onAuthStateChanged) {
firebase.authStateListener = function(auth, user) {
console.log("--------- auth change 1, user: " + user);
arg.onAuthStateChanged({
loggedIn: user !== null,
user: toLoginResult(user)
});
};
FIRAuth.auth().addAuthStateDidChangeListener(firebase.authStateListener);
}
// Listen to auth state changes
if (!firebase.authStateListener) {
firebase.authStateListener = function(auth, user) {
console.log("--------- auth change 2, user: " + user);
firebase.notifyAuthStateListeners({
loggedIn: user !== null,
user: toLoginResult(user)
});
};
FIRAuth.auth().addAuthStateDidChangeListener(firebase.authStateListener);
}
// TODO can we move the stuff from app.js to here?
if (typeof(FBSDKAppEvents) !== "undefined") {
FBSDKAppEvents.activateApp();
}
resolve(instance);

@@ -78,2 +109,34 @@ } catch (ex) {

firebase.getCurrentUser = function (arg) {
return new Promise(function (resolve, reject) {
try {
var fAuth = FIRAuth.auth();
if (fAuth === null) {
reject("Run init() first!");
return;
}
var user = fAuth.currentUser;
console.log("getCurrentUser: " + user);
if (user) {
resolve({
uid: user.uid,
// anonymous: user.anonymous,
// provider: user.providerID,
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null,
email: user.email,
emailVerified: user.emailVerified,
name: user.displayName,
refreshToken: user.refreshToken
});
} else {
reject();
}
} catch (ex) {
console.log("Error in firebase.getCurrentUser: " + ex);
reject(ex);
}
});
};
firebase.logout = function (arg) {

@@ -91,2 +154,15 @@ return new Promise(function (resolve, reject) {

function toLoginResult(user) {
return user && {
uid: user.uid,
// anonymous: user.anonymous,
// provider: user.providerID,
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null,
email: user.email,
emailVerified: user.emailVerified,
name: user.displayName,
refreshToken: user.refreshToken,
};
}
firebase.login = function (arg) {

@@ -99,14 +175,7 @@ return new Promise(function (resolve, reject) {

} else {
console.log(user);
console.log(JSON.stringify(user));
console.log(firebase.toJsObject(user));
resolve(toLoginResult(user));
resolve({
uid: user.uid,
provider: user.providerID,
profileImageURL: user.photoURL,
email: user.email,
name: user.displayName
// expiresAtUnixEpochSeconds: user.expires,
// token: user.token
firebase.notifyAuthStateListeners({
loggedIn: true,
user: user
});

@@ -130,2 +199,68 @@ }

}
} else if (arg.type === firebase.LoginType.CUSTOM) {
if (!arg.token && !arg.tokenProviderFn) {
reject("Auth type custom requires a token or a tokenProviderFn argument");
} else if (arg.token) {
fAuth.signInWithCustomToken(arg.token, onCompletion);
} else if (arg.tokenProviderFn) {
arg.tokenProviderFn()
.then(
function (token) {
firebaseAuth.signInWithCustomToken(arg.token, onCompletion);
},
function (error) {
reject(error);
}
);
}
} else if (arg.type === firebase.LoginType.FACEBOOK) {
if (typeof(FBSDKLoginManager) === "undefined") {
reject("Facebook SDK not installed - see Podfile");
return;
}
var onFacebookCompletion = function(fbSDKLoginManagerLoginResult, error) {
if (error) {
console.log("FB login error " + error);
reject(error.localizedDescription);
} else if (fbSDKLoginManagerLoginResult.isCancelled) {
reject("login cancelled");
} else {
console.log("fAuth.currentUser 2: " + fAuth.currentUser);
// headless facebook auth
// var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(fbSDKLoginManagerLoginResult.token.tokenString);
var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString);
console.log("fIRAuthCredential: " + fIRAuthCredential);
console.log("fAuth.currentUser 3: " + fAuth.currentUser);
if (fAuth.currentUser) {
// link credential, note that you only want to do this if this user doesn't already use fb as an auth provider
var onCompletionLink = function (user, error) {
if (error) {
// ignore, as this one was probably already linked, so just return the user
log("--- linking error: " + error.localizedDescription);
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion);
} else {
onCompletion(user);
}
};
fAuth.currentUser.linkWithCredentialCompletion(fIRAuthCredential, onCompletionLink);
} else {
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion);
}
}
};
// this requires you to set the appid and customurlscheme in app_resources/.plist
var fbSDKLoginManager = FBSDKLoginManager.new();
//fbSDKLoginManager.loginBehavior = FBSDKLoginBehavior.Web;
fbSDKLoginManager.logInWithReadPermissionsFromViewControllerHandler(
["public_profile", "email"], // TODO allow user to pass this in
null, // the viewcontroller param can be null since by default topmost is taken
onFacebookCompletion);
} else {

@@ -180,3 +315,3 @@ reject ("Unsupported auth type: " + arg.type);

if (user === null) {
reject("Please log the user in first");
reject("no current user");
} else {

@@ -219,2 +354,27 @@ user.updatePasswordCompletion(arg.newPassword, onCompletion);

firebase.deleteUser = function (arg) {
return new Promise(function (resolve, reject) {
try {
var user = FIRAuth.auth().currentUser;
if (user === null) {
reject("no current user");
return;
}
var onCompletion = function(user, error) {
if (error) {
reject(error.localizedDescription);
} else {
resolve();
}
};
user.deleteWithCompletion(onCompletion);
} catch (ex) {
console.log("Error in firebase.deleteUser: " + ex);
reject(ex);
}
});
};
firebase._addObservers = function(to, updateCallback) {

@@ -221,0 +381,0 @@ to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildAdded, function (snapshot) {

{
"name": "nativescript-plugin-firebase",
"version": "3.0.1",
"version": "3.1.0",
"description" : "Fire. Base. Firebase!",

@@ -19,3 +19,6 @@ "main" : "firebase.js",

"Firebase",
"Database"
"Database",
"Authentication",
"Facebook",
"Google"
],

@@ -22,0 +25,0 @@ "author": "Telerik / Eddy Verbruggen <eddyverbruggen@gmail.com>",

@@ -68,3 +68,9 @@ # NativeScript Firebase plugin

firebase.init({
persist: true // Allow disk persistence. Default false.
persist: true, // Allow disk persistence. Default false.
onAuthStateChanged: function(data) { // optional but useful to immediately re-logon the user when he re-visits your app
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase");
if (data.loggedIn) {
console.log("user's email address: " + (data.user.email ? data.user.email : "N/A"));
}
}
}).then(

@@ -227,3 +233,9 @@ function (instance) {

### login
v 1.1.0 of this plugin adds the capability to log your users in. Either anonymously or by email and password.
v 1.1.0 of this plugin adds the capability to log your users in, either
- anonymously,
- by email and password, or
- using a custom token,
- using Facebook (experimental)
You need to add support for those features in your Firebase instance at the 'Login & Auth' tab.

@@ -233,2 +245,35 @@

#### Listening to auth state changes
As stated [here](https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user)
> The recommended way to get the current user is by setting a listener on the Auth object
To listen to auth state changes you can register a listener like this (you may have done this already during `init` (see above):
```js
var listener = {
onAuthStateChanged: function(data) {
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase");
if (data.loggedIn) {
console.log("User info", data.user);
}
},
thisArg: this
};
firebase.addAuthStateListener(listener);
```
To stop listening to auth state changed:
```js
firebase.removeAuthStateListener(listener);
```
To check if already listening to auth state changes
```js
hasAuthStateListener(listener);
```
#### Anonymous login

@@ -268,21 +313,18 @@ ```js

#### Creating a Password account
#### Custom login
Use this login type to authenticate against firebase using a token generated by your own backend server.
See these [instructions on how to generate the authentication token](https://firebase.google.com/docs/auth/server).
```js
firebase.createUser({
email: 'eddyverbruggen@gmail.com',
password: 'firebase'
firebase.login({
// note that you need to generate the login token in your existing backend server
type: firebase.LoginType.CUSTOM,
token: token
}).then(
function (result) {
dialogs.alert({
title: "User created",
message: "userid: " + result.key,
okButtonText: "Nice!"
})
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
dialogs.alert({
title: "No user created",
message: errorMessage,
okButtonText: "OK, got it"
})
console.log(errorMessage);
}

@@ -292,4 +334,40 @@ )

#### Resetting a password
#### Custom login
Use this login type to authenticate against firebase using a token generated by your own backend server.
See these [instructions on how to generate the authentication token](https://firebase.google.com/docs/auth/server).
```js
firebase.login({
// note that you need to generate the login token in your existing backend server
type: firebase.LoginType.CUSTOM,
token: token
}).then(
function (result) {
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
```
#### Facebook login
On iOS this is rock solid, but on Android it's work in progress. If you want to use it for iOS open the `Podfile` in the plugin's `platforms/ios` folder and uncomment the Facebook line (you can't miss it).
```js
firebase.login({
type: firebase.LoginType.FACEBOOK
}).then(
function (result) {
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
```
### Resetting a password
```js
firebase.resetPassword({

@@ -308,3 +386,3 @@ email: 'useraccount@provider.com'

#### Changing a password
### Changing a password
```js

@@ -332,2 +410,26 @@ firebase.changePassword({

## Known issues
On Android you could run into an error like this:
```
com.android.dex.DexIndexOverflowException: method ID not in..
```
Congrats, you ran into [this issue](https://github.com/NativeScript/android-runtime/issues/344)
which can be solved by adding `multiDexEnabled true` to your `app/App_Resources/Android/app.gradle`
so it becomes something like this:
```
android {
defaultConfig {
applicationId "my.package.id"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
```
## Pro tips

@@ -350,5 +452,5 @@

- Possibly add more login mechanisms.
- Add other Firebase 3.x SDK features (there's already a few feature requests in the GitHub issue tracker.
## Credits
The starting point for this plugin was [this great Gist](https://gist.github.com/jbristowe/c89a7bcae7fc9a035ee7) by [John Bristowe](https://github.com/jbristowe).

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc