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;
}
bool QAndroidGoogleAccount::signIn(int scope)
bool QAndroidGoogleAccount::signIn(const QString &ScopeName)
{
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;
}
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<jstring>()
);
if(SignInIntent.isValid())
{
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_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();

View File

@ -30,6 +30,7 @@ QAndroidGoogleDrive::QAndroidGoogleDrive() : m_JavaGoogleDrive("com/falsinsoft/q
QtAndroid::androidActivity().object<jobject>())
{
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<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
{
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();
};

View File

@ -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<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)
{
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<GoogleSignInAccount> 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();

View File

@ -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;
}
}

View File

@ -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 { }

View File

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

View File

@ -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'
}
}

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"
}
}