Started code for google driver access

This commit is contained in:
FalsinSoft 2019-10-03 16:11:10 +02:00
parent 8be3bd206e
commit 8c20913be8
10 changed files with 135 additions and 126 deletions

View File

@ -62,21 +62,26 @@ QAndroidGoogleAccount* QAndroidGoogleAccount::instance()
return m_pInstance; return m_pInstance;
} }
bool QAndroidGoogleAccount::signIn(int scope) bool QAndroidGoogleAccount::signIn(const QString &ScopeName)
{ {
if(m_JavaGoogleAccount.isValid()) if(m_JavaGoogleAccount.isValid())
{ {
return m_JavaGoogleAccount.callMethod<jboolean>("signIn", "(I)Z", scope); return m_JavaGoogleAccount.callMethod<jboolean>("signIn",
"(Ljava/lang/String;)Z",
QAndroidJniObject::fromString(ScopeName).object<jstring>()
);
} }
return false; return false;
} }
bool QAndroidGoogleAccount::signInSelectAccount(int scope) bool QAndroidGoogleAccount::signInSelectAccount(const QString &ScopeName)
{ {
if(m_JavaGoogleAccount.isValid()) if(m_JavaGoogleAccount.isValid())
{ {
const QAndroidJniObject SignInIntent = m_JavaGoogleAccount.callObjectMethod("getSignInIntent", "(I)Landroid/content/Intent;", scope); const QAndroidJniObject SignInIntent = m_JavaGoogleAccount.callObjectMethod("getSignInIntent",
"(Ljava/lang/String;)Landroid/content/Intent;",
QAndroidJniObject::fromString(ScopeName).object<jstring>()
);
if(SignInIntent.isValid()) if(SignInIntent.isValid())
{ {
QtAndroid::startActivity(SignInIntent, m_SignInId, this); QtAndroid::startActivity(SignInIntent, m_SignInId, this);

View File

@ -50,7 +50,6 @@ class QAndroidGoogleAccount : public QObject, public QAndroidActivityResultRecei
{ {
Q_PROPERTY(QAndroidGoogleAccountInfo signedInAccount READ getSignedInAccountInfo NOTIFY signedInAccountInfoChanged) Q_PROPERTY(QAndroidGoogleAccountInfo signedInAccount READ getSignedInAccountInfo NOTIFY signedInAccountInfoChanged)
Q_DISABLE_COPY(QAndroidGoogleAccount) Q_DISABLE_COPY(QAndroidGoogleAccount)
Q_ENUMS(SCOPES)
Q_OBJECT Q_OBJECT
class AccountPhotoImageProvider : public QQuickImageProvider class AccountPhotoImageProvider : public QQuickImageProvider
@ -78,33 +77,11 @@ class QAndroidGoogleAccount : public QObject, public QAndroidActivityResultRecei
QAndroidGoogleAccount(); QAndroidGoogleAccount();
public: public:
enum SCOPES
{
SCOPE_NULL = 0,
SCOPE_APP_STATE,
SCOPE_CLOUD_SAVE,
SCOPE_DRIVE_APPFOLDER,
SCOPE_DRIVE_FILE,
SCOPE_EMAIL,
SCOPE_FITNESS_ACTIVITY_READ,
SCOPE_FITNESS_ACTIVITY_READ_WRITE,
SCOPE_FITNESS_BODY_READ,
SCOPE_FITNESS_BODY_READ_WRITE,
SCOPE_FITNESS_LOCATION_READ,
SCOPE_FITNESS_LOCATION_READ_WRITE,
SCOPE_FITNESS_NUTRITION_READ,
SCOPE_FITNESS_NUTRITION_READ_WRITE,
SCOPE_GAMES,
SCOPE_PLUS_ME,
SCOPE_PROFILE
};
static QObject* qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine); static QObject* qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine);
static QAndroidGoogleAccount* instance(); static QAndroidGoogleAccount* instance();
Q_INVOKABLE bool signIn(int scope = SCOPE_NULL); Q_INVOKABLE bool signIn(const QString &ScopeName = QString());
Q_INVOKABLE bool signInSelectAccount(int scope = SCOPE_NULL); Q_INVOKABLE bool signInSelectAccount(const QString &ScopeName = QString());
Q_INVOKABLE bool signOut(); Q_INVOKABLE bool signOut();
Q_INVOKABLE bool revokeAccess(); Q_INVOKABLE bool revokeAccess();

View File

@ -30,6 +30,7 @@ QAndroidGoogleDrive::QAndroidGoogleDrive() : m_JavaGoogleDrive("com/falsinsoft/q
QtAndroid::androidActivity().object<jobject>()) QtAndroid::androidActivity().object<jobject>())
{ {
m_pInstance = this; m_pInstance = this;
LoadScopeDefinitions();
} }
QObject* QAndroidGoogleDrive::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine) QObject* QAndroidGoogleDrive::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine)
@ -45,3 +46,16 @@ QAndroidGoogleDrive* QAndroidGoogleDrive::instance()
return m_pInstance; return m_pInstance;
} }
void QAndroidGoogleDrive::LoadScopeDefinitions()
{
const char ScopesClass[] = "com/google/api/services/drive/DriveScopes";
m_ScopeList[0] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE").toString();
m_ScopeList[1] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_APPDATA").toString();
m_ScopeList[2] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_FILE").toString();
m_ScopeList[3] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_METADATA").toString();
m_ScopeList[4] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_METADATA_READONLY").toString();
m_ScopeList[5] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_PHOTOS_READONLY").toString();
m_ScopeList[6] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_READONLY").toString();
m_ScopeList[7] = QAndroidJniObject::getStaticObjectField<jstring>(ScopesClass, "DRIVE_SCRIPTS").toString();
}

View File

@ -28,12 +28,28 @@
class QAndroidGoogleDrive : public QObject class QAndroidGoogleDrive : public QObject
{ {
Q_DISABLE_COPY(QAndroidGoogleDrive) Q_PROPERTY(QString SCOPE_DRIVE MEMBER SCOPE_DRIVE CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_APPDATA MEMBER SCOPE_DRIVE_APPDATA CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_FILE MEMBER SCOPE_DRIVE_FILE CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_METADATA MEMBER SCOPE_DRIVE_METADATA CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_METADATA_READONLY MEMBER SCOPE_DRIVE_METADATA_READONLY CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_PHOTOS_READONLY MEMBER SCOPE_DRIVE_PHOTOS_READONLY CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_READONLY MEMBER SCOPE_DRIVE_READONLY CONSTANT)
Q_PROPERTY(QString SCOPE_DRIVE_SCRIPTS MEMBER SCOPE_DRIVE_SCRIPTS CONSTANT)
Q_DISABLE_COPY(QAndroidGoogleDrive)
Q_OBJECT Q_OBJECT
QAndroidGoogleDrive(); QAndroidGoogleDrive();
public: public:
const QString &SCOPE_DRIVE = m_ScopeList[0];
const QString &SCOPE_DRIVE_APPDATA = m_ScopeList[1];
const QString &SCOPE_DRIVE_FILE = m_ScopeList[2];
const QString &SCOPE_DRIVE_METADATA = m_ScopeList[3];
const QString &SCOPE_DRIVE_METADATA_READONLY = m_ScopeList[4];
const QString &SCOPE_DRIVE_PHOTOS_READONLY = m_ScopeList[5];
const QString &SCOPE_DRIVE_READONLY = m_ScopeList[6];
const QString &SCOPE_DRIVE_SCRIPTS = m_ScopeList[7];
static QObject* qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine); static QObject* qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine);
static QAndroidGoogleDrive* instance(); static QAndroidGoogleDrive* instance();
@ -41,4 +57,7 @@ public:
private: private:
const QAndroidJniObject m_JavaGoogleDrive; const QAndroidJniObject m_JavaGoogleDrive;
static QAndroidGoogleDrive *m_pInstance; static QAndroidGoogleDrive *m_pInstance;
QString m_ScopeList[8];
void LoadScopeDefinitions();
}; };

View File

@ -61,22 +61,22 @@ public class AndroidGoogleAccount
mActivityInstance = ActivityInstance; mActivityInstance = ActivityInstance;
} }
private GoogleSignInClient getSignInClient(String ScopeValue) private GoogleSignInClient getSignInClient(String ScopeName)
{ {
GoogleSignInOptions.Builder SignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN); GoogleSignInOptions.Builder SignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN);
if(ScopeValue != null) SignInOptions.requestScopes(new Scope(ScopeValue)); if(ScopeName.isEmpty() == false) SignInOptions.requestScopes(new Scope(ScopeName));
SignInOptions.requestEmail(); SignInOptions.requestEmail();
return GoogleSignIn.getClient(mActivityInstance, SignInOptions.build()); return GoogleSignIn.getClient(mActivityInstance, SignInOptions.build());
} }
public Intent getSignInIntent(int ScopeId) public Intent getSignInIntent(String ScopeName)
{ {
Intent SignInIntent = null; Intent SignInIntent = null;
if(mGoogleSignInClient == null) if(mGoogleSignInClient == null)
{ {
mGoogleSignInClient = getSignInClient(ScopeIdToValue(ScopeId)); mGoogleSignInClient = getSignInClient(ScopeName);
SignInIntent = mGoogleSignInClient.getSignInIntent(); SignInIntent = mGoogleSignInClient.getSignInIntent();
} }
@ -86,31 +86,25 @@ public class AndroidGoogleAccount
public void signInIntentDataResult(Intent Data) public void signInIntentDataResult(Intent Data)
{ {
final Task<GoogleSignInAccount> SignInTask = GoogleSignIn.getSignedInAccountFromIntent(Data); final Task<GoogleSignInAccount> SignInTask = GoogleSignIn.getSignedInAccountFromIntent(Data);
boolean signInSuccessfully = true;
try if(SignInTask.isSuccessful())
{ {
loadSignedInAccountInfo(SignInTask.getResult(ApiException.class)); loadSignedInAccountInfo(SignInTask.getResult());
signedIn(true);
} }
catch(ApiException e) else
{ {
if(e.getStatusCode() == GoogleSignInStatusCodes.DEVELOPER_ERROR) SignInTask.addOnCompleteListener(mActivityInstance, new SignInAccountListener());
{
Log.d("AndroidGoogleAccount", "DEVELOPER_ERROR -> Have you signed your project on Android console?");
}
signInSuccessfully = false;
} }
signedIn(signInSuccessfully);
} }
public boolean signIn(int ScopeId) public boolean signIn(String ScopeName)
{ {
if(mGoogleSignInClient == null) if(mGoogleSignInClient == null)
{ {
Task<GoogleSignInAccount> SignInTask; Task<GoogleSignInAccount> SignInTask;
mGoogleSignInClient = getSignInClient(ScopeIdToValue(ScopeId)); mGoogleSignInClient = getSignInClient(ScopeName);
SignInTask = mGoogleSignInClient.silentSignIn(); SignInTask = mGoogleSignInClient.silentSignIn();
if(SignInTask.isSuccessful()) if(SignInTask.isSuccessful())
@ -251,9 +245,14 @@ public class AndroidGoogleAccount
} }
catch(ApiException e) catch(ApiException e)
{ {
if(e.getStatusCode() == GoogleSignInStatusCodes.SIGN_IN_REQUIRED) switch(e.getStatusCode())
{ {
Log.d("AndroidGoogleAccount", "SIGN_IN_REQUIRED -> You have to signin by select account before use this call"); case GoogleSignInStatusCodes.DEVELOPER_ERROR:
Log.d("AndroidGoogleAccount", "DEVELOPER_ERROR -> Have you signed your project on Android console?");
break;
case GoogleSignInStatusCodes.SIGN_IN_REQUIRED:
Log.d("AndroidGoogleAccount", "SIGN_IN_REQUIRED -> You have to signin by select account before use this call");
break;
} }
signInSuccessfully = false; signInSuccessfully = false;
mGoogleSignInClient = null; mGoogleSignInClient = null;
@ -274,65 +273,6 @@ public class AndroidGoogleAccount
} }
} }
private String ScopeIdToValue(int ScopeId)
{
String ScopeValue = null;
switch(ScopeId)
{
case SCOPE_APP_STATE:
ScopeValue = Scopes.APP_STATE;
break;
case SCOPE_CLOUD_SAVE:
ScopeValue = Scopes.CLOUD_SAVE;
break;
case SCOPE_DRIVE_APPFOLDER:
ScopeValue = Scopes.CLOUD_SAVE;
break;
case SCOPE_DRIVE_FILE:
ScopeValue = Scopes.DRIVE_FILE;
break;
case SCOPE_EMAIL:
ScopeValue = Scopes.EMAIL;
break;
case SCOPE_FITNESS_ACTIVITY_READ:
ScopeValue = Scopes.FITNESS_ACTIVITY_READ;
break;
case SCOPE_FITNESS_ACTIVITY_READ_WRITE:
ScopeValue = Scopes.FITNESS_ACTIVITY_READ_WRITE;
break;
case SCOPE_FITNESS_BODY_READ:
ScopeValue = Scopes.FITNESS_BODY_READ;
break;
case SCOPE_FITNESS_BODY_READ_WRITE:
ScopeValue = Scopes.FITNESS_BODY_READ_WRITE;
break;
case SCOPE_FITNESS_LOCATION_READ:
ScopeValue = Scopes.FITNESS_LOCATION_READ;
break;
case SCOPE_FITNESS_LOCATION_READ_WRITE:
ScopeValue = Scopes.FITNESS_LOCATION_READ_WRITE;
break;
case SCOPE_FITNESS_NUTRITION_READ:
ScopeValue = Scopes.FITNESS_NUTRITION_READ;
break;
case SCOPE_FITNESS_NUTRITION_READ_WRITE:
ScopeValue = Scopes.FITNESS_NUTRITION_READ_WRITE;
break;
case SCOPE_GAMES:
ScopeValue = Scopes.GAMES;
break;
case SCOPE_PLUS_ME:
ScopeValue = Scopes.PLUS_ME;
break;
case SCOPE_PROFILE:
ScopeValue = Scopes.PROFILE;
break;
}
return ScopeValue;
}
public static class AccountInfo public static class AccountInfo
{ {
public String id; public String id;
@ -343,23 +283,6 @@ public class AndroidGoogleAccount
public Bitmap photo; public Bitmap photo;
} }
private static final int SCOPE_APP_STATE = 1;
private static final int SCOPE_CLOUD_SAVE = 2;
private static final int SCOPE_DRIVE_APPFOLDER = 3;
private static final int SCOPE_DRIVE_FILE = 4;
private static final int SCOPE_EMAIL = 5;
private static final int SCOPE_FITNESS_ACTIVITY_READ = 6;
private static final int SCOPE_FITNESS_ACTIVITY_READ_WRITE = 7;
private static final int SCOPE_FITNESS_BODY_READ = 8;
private static final int SCOPE_FITNESS_BODY_READ_WRITE = 9;
private static final int SCOPE_FITNESS_LOCATION_READ = 10;
private static final int SCOPE_FITNESS_LOCATION_READ_WRITE = 11;
private static final int SCOPE_FITNESS_NUTRITION_READ = 12;
private static final int SCOPE_FITNESS_NUTRITION_READ_WRITE = 13;
private static final int SCOPE_GAMES = 14;
private static final int SCOPE_PLUS_ME = 15;
private static final int SCOPE_PROFILE = 16;
private static native void updateSignedInAccountInfo(AccountInfo accountInfo); private static native void updateSignedInAccountInfo(AccountInfo accountInfo);
private static native void signedIn(boolean signInSuccessfully); private static native void signedIn(boolean signInSuccessfully);
private static native void signedOut(); private static native void signedOut();

View File

@ -34,13 +34,49 @@ import android.provider.MediaStore;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.ComponentName; import android.content.ComponentName;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.common.api.Scope;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import java.util.Collections;
public class AndroidGoogleDrive public class AndroidGoogleDrive
{ {
private final Activity mActivityInstance; private final Activity mActivityInstance;
private Drive mDriveService = null;
public AndroidGoogleDrive(Activity ActivityInstance) public AndroidGoogleDrive(Activity ActivityInstance)
{ {
mActivityInstance = ActivityInstance; mActivityInstance = ActivityInstance;
} }
public boolean authenticate(String AppName, String ScopeName)
{
final GoogleSignInAccount SignInAccount = GoogleSignIn.getLastSignedInAccount(mActivityInstance);
if(SignInAccount != null)
{
GoogleAccountCredential AccountCredential;
Drive.Builder DriveBuilder;
AccountCredential = GoogleAccountCredential.usingOAuth2(mActivityInstance, Collections.singleton(ScopeName));
AccountCredential.setSelectedAccount(SignInAccount.getAccount());
DriveBuilder = new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), AccountCredential);
DriveBuilder.setApplicationName(AppName);
mDriveService = DriveBuilder.build();
return true;
}
return false;
}
} }

View File

@ -96,6 +96,7 @@ ApplicationWindow {
ListElement { title: "AdMobRewardedVideo"; source: "qrc:/tools/AndroidAdMobRewardedVideo.qml" } ListElement { title: "AdMobRewardedVideo"; source: "qrc:/tools/AndroidAdMobRewardedVideo.qml" }
ListElement { title: "PlayStore"; source: "qrc:/tools/AndroidPlayStore.qml" } ListElement { title: "PlayStore"; source: "qrc:/tools/AndroidPlayStore.qml" }
ListElement { title: "GoogleAccount"; source: "qrc:/tools/AndroidGoogleAccount.qml" } ListElement { title: "GoogleAccount"; source: "qrc:/tools/AndroidGoogleAccount.qml" }
ListElement { title: "GoogleDrive"; source: "qrc:/tools/AndroidGoogleDrive.qml" }
} }
ScrollIndicator.vertical: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { }

View File

@ -15,5 +15,6 @@
<file>tools/AndroidPlayStore.qml</file> <file>tools/AndroidPlayStore.qml</file>
<file>tools/AndroidAdMobRewardedVideo.qml</file> <file>tools/AndroidAdMobRewardedVideo.qml</file>
<file>tools/AndroidGoogleAccount.qml</file> <file>tools/AndroidGoogleAccount.qml</file>
<file>tools/AndroidGoogleDrive.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -21,6 +21,13 @@ dependencies {
implementation 'com.android.support:support-v4:26.+' implementation 'com.android.support:support-v4:26.+'
implementation 'com.google.android.gms:play-services-ads:16.+' implementation 'com.google.android.gms:play-services-ads:16.+'
implementation 'com.google.android.gms:play-services-auth:16.+' implementation 'com.google.android.gms:play-services-auth:16.+'
implementation 'com.google.http-client:google-http-client-gson:1.26.0'
implementation('com.google.api-client:google-api-client-android:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation ('com.google.apis:google-api-services-drive:v3-rev173-1.25.0') {
exclude group: 'org.apache.httpcomponents'
}
} }
android { android {
@ -57,4 +64,15 @@ android {
lintOptions { lintOptions {
abortOnError false abortOnError false
} }
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'
}
} }

View File

@ -0,0 +1,15 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Dialogs 1.3
import QtAndroidTools 1.0
Page {
id: page
padding: 0
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: "test"
}
}