From 8c20913be8e60c3d56e388f9f5fc26ce47e7bc67 Mon Sep 17 00:00:00 2001 From: FalsinSoft Date: Thu, 3 Oct 2019 16:11:10 +0200 Subject: [PATCH] Started code for google driver access --- QtAndroidTools/QAndroidGoogleAccount.cpp | 15 ++- QtAndroidTools/QAndroidGoogleAccount.h | 27 +---- QtAndroidTools/QAndroidGoogleDrive.cpp | 14 +++ QtAndroidTools/QAndroidGoogleDrive.h | 21 +++- .../qtandroidtools/AndroidGoogleAccount.java | 113 +++--------------- .../qtandroidtools/AndroidGoogleDrive.java | 36 ++++++ QtAndroidToolsDemo/Main.qml | 1 + QtAndroidToolsDemo/Sources.qrc | 1 + QtAndroidToolsDemo/android/build.gradle | 18 +++ .../tools/AndroidGoogleDrive.qml | 15 +++ 10 files changed, 135 insertions(+), 126 deletions(-) create mode 100644 QtAndroidToolsDemo/tools/AndroidGoogleDrive.qml diff --git a/QtAndroidTools/QAndroidGoogleAccount.cpp b/QtAndroidTools/QAndroidGoogleAccount.cpp index 449912b..0c5cf76 100644 --- a/QtAndroidTools/QAndroidGoogleAccount.cpp +++ b/QtAndroidTools/QAndroidGoogleAccount.cpp @@ -62,21 +62,26 @@ QAndroidGoogleAccount* QAndroidGoogleAccount::instance() return m_pInstance; } -bool QAndroidGoogleAccount::signIn(int scope) +bool QAndroidGoogleAccount::signIn(const QString &ScopeName) { if(m_JavaGoogleAccount.isValid()) { - return m_JavaGoogleAccount.callMethod("signIn", "(I)Z", scope); + return m_JavaGoogleAccount.callMethod("signIn", + "(Ljava/lang/String;)Z", + QAndroidJniObject::fromString(ScopeName).object() + ); } return false; } -bool QAndroidGoogleAccount::signInSelectAccount(int scope) +bool QAndroidGoogleAccount::signInSelectAccount(const QString &ScopeName) { 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() + ); if(SignInIntent.isValid()) { QtAndroid::startActivity(SignInIntent, m_SignInId, this); diff --git a/QtAndroidTools/QAndroidGoogleAccount.h b/QtAndroidTools/QAndroidGoogleAccount.h index debb3e9..96a0cfd 100644 --- a/QtAndroidTools/QAndroidGoogleAccount.h +++ b/QtAndroidTools/QAndroidGoogleAccount.h @@ -50,7 +50,6 @@ class QAndroidGoogleAccount : public QObject, public QAndroidActivityResultRecei { Q_PROPERTY(QAndroidGoogleAccountInfo signedInAccount READ getSignedInAccountInfo NOTIFY signedInAccountInfoChanged) Q_DISABLE_COPY(QAndroidGoogleAccount) - Q_ENUMS(SCOPES) Q_OBJECT class AccountPhotoImageProvider : public QQuickImageProvider @@ -78,33 +77,11 @@ class QAndroidGoogleAccount : public QObject, public QAndroidActivityResultRecei QAndroidGoogleAccount(); 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 QAndroidGoogleAccount* instance(); - Q_INVOKABLE bool signIn(int scope = SCOPE_NULL); - Q_INVOKABLE bool signInSelectAccount(int scope = SCOPE_NULL); + Q_INVOKABLE bool signIn(const QString &ScopeName = QString()); + Q_INVOKABLE bool signInSelectAccount(const QString &ScopeName = QString()); Q_INVOKABLE bool signOut(); Q_INVOKABLE bool revokeAccess(); diff --git a/QtAndroidTools/QAndroidGoogleDrive.cpp b/QtAndroidTools/QAndroidGoogleDrive.cpp index bc137e6..9471c78 100644 --- a/QtAndroidTools/QAndroidGoogleDrive.cpp +++ b/QtAndroidTools/QAndroidGoogleDrive.cpp @@ -30,6 +30,7 @@ QAndroidGoogleDrive::QAndroidGoogleDrive() : m_JavaGoogleDrive("com/falsinsoft/q QtAndroid::androidActivity().object()) { m_pInstance = this; + LoadScopeDefinitions(); } QObject* QAndroidGoogleDrive::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine) @@ -45,3 +46,16 @@ QAndroidGoogleDrive* QAndroidGoogleDrive::instance() return m_pInstance; } +void QAndroidGoogleDrive::LoadScopeDefinitions() +{ + const char ScopesClass[] = "com/google/api/services/drive/DriveScopes"; + + m_ScopeList[0] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE").toString(); + m_ScopeList[1] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_APPDATA").toString(); + m_ScopeList[2] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_FILE").toString(); + m_ScopeList[3] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_METADATA").toString(); + m_ScopeList[4] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_METADATA_READONLY").toString(); + m_ScopeList[5] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_PHOTOS_READONLY").toString(); + m_ScopeList[6] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_READONLY").toString(); + m_ScopeList[7] = QAndroidJniObject::getStaticObjectField(ScopesClass, "DRIVE_SCRIPTS").toString(); +} diff --git a/QtAndroidTools/QAndroidGoogleDrive.h b/QtAndroidTools/QAndroidGoogleDrive.h index 81b8bf1..e19034f 100644 --- a/QtAndroidTools/QAndroidGoogleDrive.h +++ b/QtAndroidTools/QAndroidGoogleDrive.h @@ -28,12 +28,28 @@ 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 QAndroidGoogleDrive(); 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 QAndroidGoogleDrive* instance(); @@ -41,4 +57,7 @@ public: private: const QAndroidJniObject m_JavaGoogleDrive; static QAndroidGoogleDrive *m_pInstance; + QString m_ScopeList[8]; + + void LoadScopeDefinitions(); }; diff --git a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleAccount.java b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleAccount.java index 170ea91..e9bbd29 100644 --- a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleAccount.java +++ b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleAccount.java @@ -61,22 +61,22 @@ public class AndroidGoogleAccount mActivityInstance = ActivityInstance; } - private GoogleSignInClient getSignInClient(String ScopeValue) + private GoogleSignInClient getSignInClient(String ScopeName) { 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(); return GoogleSignIn.getClient(mActivityInstance, SignInOptions.build()); } - public Intent getSignInIntent(int ScopeId) + public Intent getSignInIntent(String ScopeName) { Intent SignInIntent = null; if(mGoogleSignInClient == null) { - mGoogleSignInClient = getSignInClient(ScopeIdToValue(ScopeId)); + mGoogleSignInClient = getSignInClient(ScopeName); SignInIntent = mGoogleSignInClient.getSignInIntent(); } @@ -86,31 +86,25 @@ public class AndroidGoogleAccount public void signInIntentDataResult(Intent Data) { final Task 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) - { - Log.d("AndroidGoogleAccount", "DEVELOPER_ERROR -> Have you signed your project on Android console?"); - } - signInSuccessfully = false; + SignInTask.addOnCompleteListener(mActivityInstance, new SignInAccountListener()); } - - signedIn(signInSuccessfully); } - public boolean signIn(int ScopeId) + public boolean signIn(String ScopeName) { if(mGoogleSignInClient == null) { Task SignInTask; - mGoogleSignInClient = getSignInClient(ScopeIdToValue(ScopeId)); + mGoogleSignInClient = getSignInClient(ScopeName); SignInTask = mGoogleSignInClient.silentSignIn(); if(SignInTask.isSuccessful()) @@ -251,9 +245,14 @@ public class AndroidGoogleAccount } 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; 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 String id; @@ -343,23 +283,6 @@ public class AndroidGoogleAccount 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 signedIn(boolean signInSuccessfully); private static native void signedOut(); diff --git a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleDrive.java b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleDrive.java index 447c584..79410e1 100644 --- a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleDrive.java +++ b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AndroidGoogleDrive.java @@ -34,13 +34,49 @@ import android.provider.MediaStore; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; 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 { private final Activity mActivityInstance; + private Drive mDriveService = null; public AndroidGoogleDrive(Activity 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; + } } diff --git a/QtAndroidToolsDemo/Main.qml b/QtAndroidToolsDemo/Main.qml index f932c33..ecaf7a4 100644 --- a/QtAndroidToolsDemo/Main.qml +++ b/QtAndroidToolsDemo/Main.qml @@ -96,6 +96,7 @@ ApplicationWindow { ListElement { title: "AdMobRewardedVideo"; source: "qrc:/tools/AndroidAdMobRewardedVideo.qml" } ListElement { title: "PlayStore"; source: "qrc:/tools/AndroidPlayStore.qml" } ListElement { title: "GoogleAccount"; source: "qrc:/tools/AndroidGoogleAccount.qml" } + ListElement { title: "GoogleDrive"; source: "qrc:/tools/AndroidGoogleDrive.qml" } } ScrollIndicator.vertical: ScrollIndicator { } diff --git a/QtAndroidToolsDemo/Sources.qrc b/QtAndroidToolsDemo/Sources.qrc index e9b4cc6..60b5078 100644 --- a/QtAndroidToolsDemo/Sources.qrc +++ b/QtAndroidToolsDemo/Sources.qrc @@ -15,5 +15,6 @@ tools/AndroidPlayStore.qml tools/AndroidAdMobRewardedVideo.qml tools/AndroidGoogleAccount.qml + tools/AndroidGoogleDrive.qml diff --git a/QtAndroidToolsDemo/android/build.gradle b/QtAndroidToolsDemo/android/build.gradle index f5e64d1..a10a5e7 100644 --- a/QtAndroidToolsDemo/android/build.gradle +++ b/QtAndroidToolsDemo/android/build.gradle @@ -21,6 +21,13 @@ dependencies { implementation 'com.android.support:support-v4:26.+' implementation 'com.google.android.gms:play-services-ads: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 { @@ -57,4 +64,15 @@ android { lintOptions { 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' + } } diff --git a/QtAndroidToolsDemo/tools/AndroidGoogleDrive.qml b/QtAndroidToolsDemo/tools/AndroidGoogleDrive.qml new file mode 100644 index 0000000..e53d146 --- /dev/null +++ b/QtAndroidToolsDemo/tools/AndroidGoogleDrive.qml @@ -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" + } +}