diff --git a/src/Kp2aBusinessLogic/Io/GDriveFileStorage.cs b/src/Kp2aBusinessLogic/Io/GDriveFileStorage.cs index 1636e232..9d83c3ba 100644 --- a/src/Kp2aBusinessLogic/Io/GDriveFileStorage.cs +++ b/src/Kp2aBusinessLogic/Io/GDriveFileStorage.cs @@ -17,7 +17,7 @@ namespace keepass2android.Io public class GoogleDriveFileStorage : JavaFileStorage { public GoogleDriveFileStorage(Context ctx, IKp2aApp app) : - base(new Keepass2android.Javafilestorage.GoogleDriveFileStorage(), app) + base(new Keepass2android.Javafilestorage.GoogleDriveFullFileStorage(), app) { } @@ -27,5 +27,19 @@ namespace keepass2android.Io get { return false; } } } + + public class GoogleDriveAppDataFileStorage : JavaFileStorage + { + public GoogleDriveAppDataFileStorage(Context ctx, IKp2aApp app) : + base(new Keepass2android.Javafilestorage.GoogleDriveAppDataFileStorage(), app) + { + } + + + public override bool UserShouldBackup + { + get { return false; } + } + } } #endif \ No newline at end of file diff --git a/src/Kp2aBusinessLogic/Resources/Resource.Designer.cs b/src/Kp2aBusinessLogic/Resources/Resource.Designer.cs index c071c0da..692799c7 100644 --- a/src/Kp2aBusinessLogic/Resources/Resource.Designer.cs +++ b/src/Kp2aBusinessLogic/Resources/Resource.Designer.cs @@ -2998,7 +2998,10 @@ namespace keepass2android public static int config_tooltipAnimTime = 2131230727; // aapt resource value: 0x7F080008 - public static int status_bar_notification_info_maxnum = 2131230728; + public static int google_play_services_version = 2131230728; + + // aapt resource value: 0x7F080009 + public static int status_bar_notification_info_maxnum = 2131230729; static Integer() { @@ -3560,13 +3563,16 @@ namespace keepass2android public static int app_name = 2131492964; // aapt resource value: 0x7F0C0065 - public static int library_name = 2131492965; + public static int common_google_play_services_unknown_issue = 2131492965; // aapt resource value: 0x7F0C0066 - public static int search_menu_title = 2131492966; + public static int library_name = 2131492966; // aapt resource value: 0x7F0C0067 - public static int status_bar_notification_info_overflow = 2131492967; + public static int search_menu_title = 2131492967; + + // aapt resource value: 0x7F0C0068 + public static int status_bar_notification_info_overflow = 2131492968; static String() { diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveAppDataFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveAppDataFileStorage.java new file mode 100644 index 00000000..4595d97c --- /dev/null +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveAppDataFileStorage.java @@ -0,0 +1,18 @@ +package keepass2android.javafilestorage; + +import com.google.android.gms.common.Scopes; + +public class GoogleDriveAppDataFileStorage extends GoogleDriveBaseFileStorage +{ + private static final String GDRIVE_PROTOCOL_ID = "gdriveKP2A"; + + @Override + protected String getScopeString() { + return Scopes.DRIVE_FILE; + } + + @Override + public String getProtocolId() { + return GDRIVE_PROTOCOL_ID; + } +} diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveBaseFileStorage.java similarity index 98% rename from src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFileStorage.java rename to src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveBaseFileStorage.java index 1851a579..9cf69bae 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFileStorage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveBaseFileStorage.java @@ -55,9 +55,9 @@ import com.google.android.gms.tasks.Task; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -public class GoogleDriveFileStorage extends JavaFileStorageBase { +public abstract class GoogleDriveBaseFileStorage extends JavaFileStorageBase { + - private static final String GDRIVE_PROTOCOL_ID = "gdrive"; private static final String FOLDER_MIME_TYPE = "application/vnd.google-apps.folder"; static final int MAGIC_GDRIVE=2082334; static final int REQUEST_ACCOUNT_PICKER = MAGIC_GDRIVE+1; @@ -89,7 +89,7 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { public String getRootPathForAccount(String accountName) throws UnsupportedEncodingException { - return GDRIVE_PROTOCOL_ID+"://"+encode(accountName)+"/"; + return getProtocolId()+"://"+encode(accountName)+"/"; } class GDrivePath @@ -276,7 +276,7 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { }; - public GoogleDriveFileStorage() + public GoogleDriveBaseFileStorage() { logDebug("Creating GDrive FileStorage."); } @@ -612,7 +612,7 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { try { // Signed in successfully GoogleSignInAccount account = completedTask.getResult(ApiException.class); - if (GoogleSignIn.hasPermissions(account, new Scope(Scopes.DRIVE_FULL))) { + if (GoogleSignIn.hasPermissions(account, getScope())) { initializeAccountOrPath(setupAct, account.getAccount().name); return; @@ -851,10 +851,6 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { } - @Override - public String getProtocolId() { - return GDRIVE_PROTOCOL_ID; - } @Override @@ -882,7 +878,7 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { // Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestScopes(new Scope(Scopes.DRIVE_FULL)) + .requestScopes(getScope()) .requestEmail() .build(); // [END configure_signin] @@ -922,10 +918,15 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { } + protected Scope getScope() { + return new Scope(getScopeString()); + } + + protected abstract String getScopeString(); private GoogleAccountCredential createCredential(Context appContext) { List scopes = new ArrayList(); - scopes.add(DriveScopes.DRIVE); + scopes.add(getScopeString()); GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(appContext, scopes); return credential; } diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFullFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFullFileStorage.java new file mode 100644 index 00000000..92f1a6fb --- /dev/null +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/GoogleDriveFullFileStorage.java @@ -0,0 +1,20 @@ +package keepass2android.javafilestorage; + +import com.google.android.gms.common.Scopes; +import com.google.android.gms.common.api.Scope; + +public class GoogleDriveFullFileStorage extends GoogleDriveBaseFileStorage +{ + private static final String GDRIVE_PROTOCOL_ID = "gdrive"; + + @Override + protected String getScopeString() { + return Scopes.DRIVE_FULL; + } + + @Override + public String getProtocolId() { + return GDRIVE_PROTOCOL_ID; + } +} + diff --git a/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest2/MainActivity.java b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest2/MainActivity.java index 6f029d9c..23adb14c 100644 --- a/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest2/MainActivity.java +++ b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest2/MainActivity.java @@ -145,7 +145,7 @@ import java.util.ArrayList; import java.util.List; //import keepass2android.javafilestorage.DropboxCloudRailStorage; -import keepass2android.javafilestorage.GoogleDriveFileStorage; +import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage; import keepass2android.javafilestorage.JavaFileStorage; import keepass2android.javafilestorage.JavaFileStorage.FileEntry; import keepass2android.javafilestorage.SftpStorage; @@ -543,7 +543,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag //storageToTest = new SkyDriveFileStorage("000000004010C234", appContext); - storageToTest = new GoogleDriveFileStorage(); + storageToTest = new GoogleDriveAppDataFileStorage(); /*storageToTest = new WebDavStorage(new ICertificateErrorHandler() { @Override public boolean onValidationError(String error) { diff --git a/src/keepass2android/Resources/drawable-mdpi/ic_storage_gdriveKP2A.png b/src/keepass2android/Resources/drawable-mdpi/ic_storage_gdriveKP2A.png new file mode 100644 index 00000000..d5dea594 Binary files /dev/null and b/src/keepass2android/Resources/drawable-mdpi/ic_storage_gdriveKP2A.png differ diff --git a/src/keepass2android/Resources/drawable-xhdpi/ic_storage_gdriveKP2A.png b/src/keepass2android/Resources/drawable-xhdpi/ic_storage_gdriveKP2A.png new file mode 100644 index 00000000..231fd5c6 Binary files /dev/null and b/src/keepass2android/Resources/drawable-xhdpi/ic_storage_gdriveKP2A.png differ diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 7290d1ed..dee5743d 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -608,6 +608,8 @@ Dropbox (KP2A folder) If you do not want to give KP2A access to your full Dropbox, you may select this option. It will request only access to the folder Apps/Keepass2Android. This is especially suited when creating a new database. If you already have a database, select this option to create the folder, then place your file inside the folder (from your PC) and then select this option again for opening the file. Google Drive + Google Drive (KP2A files) + If you do not want to give KP2A access to your full Google Drive, you may select this option. Note that you need to create a database file first, existing files are not visible to the app. Either choose this option from the Create database screen or, if you already opened a database, by exporting the database choosing this option. PCloud This storage type will only request access to the pCloud folder "Applications/Keepass2Android". If you want to use an existing database from your pCloud account, please make sure the file is placed in this pCloud folder. OneDrive diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index 56ef1767..24f25efc 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -44,6 +44,7 @@ using keepass2android.addons.OtpKeyProv; using keepass2android.database.edit; using KeePassLib.Interfaces; using KeePassLib.Utility; +using GoogleDriveAppDataFileStorage = keepass2android.Io.GoogleDriveAppDataFileStorage; #if !NoNet #if !EXCLUDE_JAVAFILESTORAGE using Android.Gms.Common; @@ -725,6 +726,7 @@ namespace keepass2android new DropboxFileStorage(LocaleManager.LocalizedAppContext, this), new DropboxAppFolderFileStorage(LocaleManager.LocalizedAppContext, this), GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveFileStorage(LocaleManager.LocalizedAppContext, this) : null, + GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveAppDataFileStorage(LocaleManager.LocalizedAppContext, this) : null, new OneDriveFileStorage(LocaleManager.LocalizedAppContext, this), new OneDrive2FullFileStorage(), new OneDrive2MyFilesFileStorage(), diff --git a/src/keepass2android/keepass2android-app.csproj b/src/keepass2android/keepass2android-app.csproj index 3eadcb8c..41e6ac8f 100644 --- a/src/keepass2android/keepass2android-app.csproj +++ b/src/keepass2android/keepass2android-app.csproj @@ -474,6 +474,7 @@ + @@ -1100,6 +1101,9 @@ + + +