integrated SkyDrive support
This commit is contained in:
		| @@ -141,6 +141,9 @@ | ||||
|       <Link>Jars\jsr305-1.3.9.jar</Link> | ||||
|     </EmbeddedReferenceJar> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <EmbeddedReferenceJar Include="Jars\livesdk.jar" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" /> | ||||
|   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.  | ||||
|        Other similar extension points exist, see Microsoft.Common.targets. | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using Android.App; | ||||
| using Android.Content; | ||||
| using Android.OS; | ||||
| using KeePassLib.Serialization; | ||||
|   | ||||
| @@ -66,6 +66,7 @@ | ||||
|     <Compile Include="Io\IFileStorage.cs" /> | ||||
|     <Compile Include="Io\IoUtil.cs" /> | ||||
|     <Compile Include="Io\JavaFileStorage.cs" /> | ||||
|     <Compile Include="Io\SkyDriveFileStorage.cs" /> | ||||
|     <Compile Include="IProgressDialog.cs" /> | ||||
|     <Compile Include="PreferenceKey.cs" /> | ||||
|     <Compile Include="UiStringKey.cs" /> | ||||
|   | ||||
							
								
								
									
										2
									
								
								src/Kp2aUnitTests/Resources/Resource.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								src/Kp2aUnitTests/Resources/Resource.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -26,7 +26,7 @@ namespace Kp2aUnitTests | ||||
| 		 | ||||
| 		public static void UpdateIdValues() | ||||
| 		{ | ||||
| 			KeePassLib2Android.Resource.String.library_name = Kp2aUnitTests.Resource.String.library_name; | ||||
| 			global::KeePassLib2Android.Resource.String.library_name = global::Kp2aUnitTests.Resource.String.library_name; | ||||
| 		} | ||||
| 		 | ||||
| 		public partial class Attribute | ||||
|   | ||||
| @@ -132,6 +132,10 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase { | ||||
| 			String[] parts = mAccountLocalPath.split("/"); | ||||
| 			 | ||||
| 			AccountData accountData = mAccountData.get(mAccount); | ||||
| 			if (accountData == null) | ||||
| 			{ | ||||
| 				throw new IllegalStateException("Looks like account "+mAccount+" was not properly initialized!"); | ||||
| 			} | ||||
| 			 | ||||
| 			String parentId = accountData.mRootFolderId; | ||||
| 			 | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
|  | ||||
| import keepass2android.javafilestorage.JavaFileStorageBase.InvalidPathException; | ||||
| import keepass2android.javafilestorage.skydrive.SkyDriveException; | ||||
| import keepass2android.javafilestorage.skydrive.SkyDriveFile; | ||||
| import keepass2android.javafilestorage.skydrive.SkyDriveFolder; | ||||
| @@ -44,8 +43,6 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
|  | ||||
| 	private LiveAuthClient mAuthClient; | ||||
|  | ||||
| 	private LiveConnectSession mSession; | ||||
|  | ||||
| 	private LiveConnectClient mConnectClient; | ||||
|  | ||||
| 	private String mRootFolderId; | ||||
| @@ -57,6 +54,10 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
| 	// see http://stackoverflow.com/questions/17997688/howto-to-parse-skydrive-api-date-in-java | ||||
| 	SimpleDateFormat SKYDRIVE_DATEFORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH); | ||||
|  | ||||
| 	private Context mAppContext; | ||||
|  | ||||
| 	private String mClientId; | ||||
|  | ||||
| 	public final class JsonKeys { | ||||
| 		public static final String CODE = "code"; | ||||
| 		public static final String DATA = "data"; | ||||
| @@ -283,6 +284,8 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
|  | ||||
| 	public SkyDriveFileStorage(String clientId, Context appContext) { | ||||
| 		mAuthClient = new LiveAuthClient(appContext, clientId); | ||||
| 		mAppContext = appContext; | ||||
| 		mClientId = clientId; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| @@ -312,7 +315,6 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
| 	private void initialize(final FileStorageSetupActivity setupAct, | ||||
| 			LiveConnectSession session) { | ||||
|  | ||||
| 		mSession = session; | ||||
| 		mConnectClient = new LiveConnectClient(session); | ||||
|  | ||||
| 		final Activity activity = (Activity)setupAct; | ||||
| @@ -458,13 +460,18 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
| 	@Override | ||||
| 	public String getDisplayName(String path) { | ||||
|  | ||||
| 		return ""; | ||||
| 		/* | ||||
| 		 * SkyDrivePath skydrivePath = new SkyDrivePath(); try { | ||||
| 		 * skydrivePath.setPathWithoutVerify(path); } catch (Exception e) { | ||||
| 		 * e.printStackTrace(); return path; } return | ||||
| 		 * skydrivePath.getDisplayName(); | ||||
| 		 */ | ||||
| 		SkyDrivePath skydrivePath = new SkyDrivePath();  | ||||
| 		try { | ||||
| 		  skydrivePath.setPathWithoutVerify(path);  | ||||
| 		}  | ||||
| 		catch (Exception e)  | ||||
| 		{ | ||||
| 		  e.printStackTrace();  | ||||
| 		  return path;  | ||||
| 		}  | ||||
| 		 | ||||
| 		return skydrivePath.getDisplayName(); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| @@ -752,6 +759,17 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
|  | ||||
| 	@Override | ||||
| 	public void onStart(final FileStorageSetupActivity activity) { | ||||
| 		try | ||||
| 		{ | ||||
| 			initialize(activity); | ||||
| 		} | ||||
| 		catch (Exception e) | ||||
| 		{ | ||||
| 			finishWithError((Activity)activity, e); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private void initialize(final FileStorageSetupActivity activity) { | ||||
| 		mAuthClient.initialize(Arrays.asList(SCOPES), new LiveAuthListener() { | ||||
| 			@Override | ||||
| 			public void onAuthError(LiveAuthException exception, | ||||
| @@ -764,14 +782,34 @@ public class SkyDriveFileStorage extends JavaFileStorageBase { | ||||
| 					LiveConnectSession session, Object userState) { | ||||
|  | ||||
| 				if (status == LiveStatus.CONNECTED) { | ||||
| 					Log.d(TAG, "connected!"); | ||||
| 					initialize(activity, session); | ||||
|  | ||||
| 				} else { | ||||
| 					login(activity); | ||||
| 					if (status == LiveStatus.NOT_CONNECTED) | ||||
| 						Log.d(TAG, "not connected"); | ||||
| 					else if (status == LiveStatus.UNKNOWN) | ||||
| 						Log.d(TAG, "unknown"); | ||||
| 					else | ||||
| 						Log.d(TAG, "unexpected status " + status); | ||||
| 					try | ||||
| 					{ | ||||
| 						login(activity); | ||||
| 					} | ||||
| 					catch (IllegalStateException e) | ||||
| 					{ | ||||
| 						//this may happen if an un-cancelled login progress is already in progress. | ||||
| 						//however, the activity might have been destroyed, so try again with another auth client next time | ||||
| 						mAuthClient = new LiveAuthClient(mAppContext, mClientId); | ||||
| 						finishWithError((Activity)activity, e); | ||||
| 					} | ||||
| 					catch (Exception e) | ||||
| 					{ | ||||
| 						finishWithError((Activity)activity, e); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import org.json.JSONObject; | ||||
|  | ||||
| public class SkyDriveFile extends SkyDriveObject { | ||||
|  | ||||
|     public static final String TYPE = "file"; | ||||
|     public static final String TYPENAME = "file"; | ||||
|  | ||||
|     public SkyDriveFile(JSONObject file) { | ||||
|         super(file); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package keepass2android.javafilestorage.skydrive; | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| public class SkyDriveFolder extends SkyDriveObject { | ||||
|     public static final String TYPE = "folder"; | ||||
|     public static final String TYPENAME = "folder"; | ||||
|  | ||||
|     public SkyDriveFolder(JSONObject object) { | ||||
|         super(object); | ||||
|   | ||||
| @@ -48,9 +48,9 @@ public abstract class SkyDriveObject { | ||||
|     public static SkyDriveObject create(JSONObject skyDriveObject) { | ||||
|         String type = skyDriveObject.optString("type"); | ||||
|  | ||||
|         if (type.equals(SkyDriveFolder.TYPE)) { | ||||
|         if (type.equals(SkyDriveFolder.TYPENAME)) { | ||||
|             return new SkyDriveFolder(skyDriveObject); | ||||
|         } else if (type.equals(SkyDriveFile.TYPE)) { | ||||
|         } else if (type.equals(SkyDriveFile.TYPENAME)) { | ||||
|             return new SkyDriveFile(skyDriveObject); | ||||
|         } else return null; | ||||
|     } | ||||
|   | ||||
							
								
								
									
										31
									
								
								src/keepass2android/Resources/Resource.designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										31
									
								
								src/keepass2android/Resources/Resource.designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -1854,46 +1854,49 @@ namespace keepass2android | ||||
| 			public const int ic_storage_https = 2130837815; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020138 | ||||
| 			public const int ic_unlocked_gray = 2130837816; | ||||
| 			public const int ic_storage_skydrive = 2130837816; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020139 | ||||
| 			public const int location_web_site = 2130837817; | ||||
| 			public const int ic_unlocked_gray = 2130837817; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013a | ||||
| 			public const int navigation_accept = 2130837818; | ||||
| 			public const int location_web_site = 2130837818; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013b | ||||
| 			public const int navigation_accept_dark = 2130837819; | ||||
| 			public const int navigation_accept = 2130837819; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013c | ||||
| 			public const int navigation_cancel = 2130837820; | ||||
| 			public const int navigation_accept_dark = 2130837820; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013d | ||||
| 			public const int navigation_previous_item = 2130837821; | ||||
| 			public const int navigation_cancel = 2130837821; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013e | ||||
| 			public const int navigation_previous_item_dark = 2130837822; | ||||
| 			public const int navigation_previous_item = 2130837822; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f02013f | ||||
| 			public const int notify = 2130837823; | ||||
| 			public const int navigation_previous_item_dark = 2130837823; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020140 | ||||
| 			public const int notify_keyboard = 2130837824; | ||||
| 			public const int notify = 2130837824; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020141 | ||||
| 			public const int oktoberfest = 2130837825; | ||||
| 			public const int notify_keyboard = 2130837825; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020142 | ||||
| 			public const int RedButton = 2130837826; | ||||
| 			public const int oktoberfest = 2130837826; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020143 | ||||
| 			public const int section_header = 2130837827; | ||||
| 			public const int RedButton = 2130837827; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020144 | ||||
| 			public const int transparent = 2130837828; | ||||
| 			public const int section_header = 2130837828; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020145 | ||||
| 			public const int YellowButton = 2130837829; | ||||
| 			public const int transparent = 2130837829; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f020146 | ||||
| 			public const int YellowButton = 2130837830; | ||||
| 			 | ||||
| 			static Drawable() | ||||
| 			{ | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/keepass2android/Resources/drawable/ic_storage_skydrive.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/keepass2android/Resources/drawable/ic_storage_skydrive.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.2 KiB | 
| @@ -393,6 +393,7 @@ namespace keepass2android | ||||
| #if !EXCLUDE_JAVAFILESTORAGE | ||||
| 							new DropboxFileStorage(Application.Context, this), | ||||
| 							new GoogleDriveFileStorage(Application.Context, this), | ||||
| 							new SkyDriveFileStorage(Application.Context, this), | ||||
| #endif | ||||
| 							new BuiltInFileStorage() | ||||
| 						}; | ||||
|   | ||||
| @@ -374,6 +374,10 @@ namespace keepass2android | ||||
| 				StartFileChooser(ioc.Path); | ||||
| #endif | ||||
| 			} | ||||
| 			if ((resultCode == Result.Canceled) && (data != null) && (data.HasExtra("EXTRA_ERROR_MESSAGE"))) | ||||
| 			{ | ||||
| 				Toast.MakeText(this, data.GetStringExtra("EXTRA_ERROR_MESSAGE"), ToastLength.Long).Show(); | ||||
| 			} | ||||
| 		} | ||||
| 		#if !EXCLUDE_FILECHOOSER | ||||
| 		private void StartFileChooser(string defaultPath) | ||||
|   | ||||
| @@ -5,6 +5,7 @@ using System.Text; | ||||
|  | ||||
| using Android.App; | ||||
| using Android.Content; | ||||
| using Android.Content.PM; | ||||
| using Android.OS; | ||||
| using Android.Runtime; | ||||
| using Android.Views; | ||||
| @@ -14,13 +15,14 @@ using keepass2android.Io; | ||||
|  | ||||
| namespace keepass2android.fileselect | ||||
| { | ||||
| 	[Activity(Label = "@string/filestorage_setup_title",Theme="@style/Base")] | ||||
| 	[Activity(Label = "@string/filestorage_setup_title",Theme="@style/Base", ConfigurationChanges=ConfigChanges.Orientation| | ||||
| 	           ConfigChanges.KeyboardHidden)] | ||||
| 	public class FileStorageSetupActivity : Activity, IFileStorageSetupActivity | ||||
| #if !EXCLUDE_JAVAFILESTORAGE | ||||
| 		,Keepass2android.Javafilestorage.IJavaFileStorageFileStorageSetupActivity | ||||
| #endif | ||||
| 	{ | ||||
| 		private bool isRecreated = false; | ||||
| 		private bool _isRecreated = false; | ||||
|  | ||||
| 		protected override void OnCreate(Bundle bundle) | ||||
| 		{ | ||||
| @@ -40,10 +42,10 @@ namespace keepass2android.fileselect | ||||
| 			else | ||||
| 			{ | ||||
| 				State = (Bundle) bundle.Clone(); | ||||
| 				isRecreated = true; | ||||
| 				_isRecreated = true; | ||||
| 			} | ||||
|  | ||||
| 			if (!isRecreated) | ||||
| 			if (!_isRecreated) | ||||
| 				App.Kp2a.GetFileStorage(Ioc).OnCreate(this, bundle); | ||||
|  | ||||
| 		} | ||||
| @@ -51,7 +53,7 @@ namespace keepass2android.fileselect | ||||
| 		protected override void OnStart() | ||||
| 		{ | ||||
| 			base.OnStart(); | ||||
| 			if (!isRecreated) | ||||
| 			if (!_isRecreated) | ||||
| 				App.Kp2a.GetFileStorage(Ioc).OnStart(this); | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -872,4 +872,10 @@ | ||||
|   <ItemGroup> | ||||
|     <AndroidResource Include="Resources\layout-v14\text_with_help.xml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <AndroidResource Include="Resources\drawable\ic_storage_skydrive.png" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <AndroidResource Include="Resources\drawable-hdpi\ic_storage_skydrive.png" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll