Compare commits
	
		
			12 Commits
		
	
	
		
			l10n_maste
			...
			v1.14-pre3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | a00267a0ac | ||
|   | 7fccb6cb16 | ||
|   | 319f5d3113 | ||
|   | b7276d1364 | ||
|   | 58429ce0c4 | ||
|   | 72a72975e0 | ||
|   | 57be7af031 | ||
|   | 5004a69bff | ||
|   | 9628f2a1b8 | ||
|   | 4cfdcb0f95 | ||
|   | 93d1eb9141 | ||
|   | 96f5953ed1 | 
							
								
								
									
										18
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -136,7 +136,23 @@ jobs: | ||||
|     - name: List apks | ||||
|       run:  find . -type f -name "*.apk" | ||||
|       shell: bash | ||||
|        | ||||
|  | ||||
|     - name: Rename apks | ||||
|       # after updating to .net9, the naming scheme of the output apks has changed. rename them to the old scheme | ||||
|       # for consistancy with previous releases | ||||
|       run: | | ||||
|         for apk in src/keepass2android-app/bin/Release/net9.0-android/android-*/publish/*-Signed.apk; do | ||||
|           [ -e "$apk" ] || continue # if glob above doesn't return anything, the loop is still executed once  | ||||
|           arch=$(basename "$(dirname "$(dirname "$apk")")")  # e.g. "android-arm64" | ||||
|           base=$(basename "$apk" .apk)                      # e.g. "keepass2android.keepass2android_nonet-Signed" | ||||
|           mv "$apk" "$(dirname "$apk")/${base}-${arch#android-}.apk" | ||||
|         done | ||||
|       shell: bash | ||||
|  | ||||
|     - name: List apks | ||||
|       run:  find . -type f -name "*.apk" | ||||
|       shell: bash         | ||||
|          | ||||
|     - name: Upload APK to GitHub Release | ||||
|       uses: softprops/action-gh-release@v2 | ||||
|       with: | ||||
|   | ||||
| @@ -8,7 +8,6 @@ using Android.Content; | ||||
| using Android.OS; | ||||
| using FluentFTP; | ||||
| using FluentFTP.Exceptions; | ||||
| using FluentFTP.GnuTLS; | ||||
| using KeePass.Util; | ||||
| using KeePassLib; | ||||
| using KeePassLib.Serialization; | ||||
| @@ -141,7 +140,6 @@ namespace keepass2android.Io | ||||
| 			var settings = ConnectionSettings.FromIoc(ioc); | ||||
| 			 | ||||
| 			FtpClient client = new FtpClient(); | ||||
|             client.Config.CustomStream = typeof(GnuTlsStream); | ||||
| 			client.Config.RetryAttempts = 3; | ||||
| 			if ((settings.Username.Length > 0) || (settings.Password.Length > 0)) | ||||
| 				client.Credentials = new NetworkCredential(settings.Username, settings.Password); | ||||
|   | ||||
| @@ -1125,9 +1125,57 @@ namespace keepass2android.Io | ||||
|             } | ||||
|  | ||||
|         } | ||||
|         public static async Task<DriveItem> GetOrCreateAppRootAsync(GraphServiceClient client, string dummyFileName = "welcome_at_kp2a.txt") | ||||
|         { | ||||
|  | ||||
|  | ||||
|         private async Task<List<FileDescription>> ListShares(OneDrive2ItemLocation<OneDrive2PrefixContainerType> parentPath, GraphServiceClient client) | ||||
|             try | ||||
|             { | ||||
|                 return await client.RequestAdapter.SendAsync( | ||||
|                     new Microsoft.Graph.Drives.Item.Items.Item.DriveItemItemRequestBuilder( | ||||
|                         new Dictionary<string, object> { | ||||
|                             { "drive%2Did", "me" }, | ||||
|                             { "driveItem%2Did", "special/approot" } | ||||
|                         }, | ||||
|                         client.RequestAdapter | ||||
|                     ).ToGetRequestInformation(), | ||||
|                     static (p) => DriveItem.CreateFromDiscriminatorValue(p) | ||||
|                 ); | ||||
|             } | ||||
|             catch (Microsoft.Kiota.Abstractions.ApiException ex) when (ex.ResponseStatusCode == 404) | ||||
|             { | ||||
|                 // App folder doesn’t exist yet → create it by uploading a dummy file | ||||
|                 using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("init")); | ||||
|  | ||||
|                 var uploadRequest = new RequestInformation | ||||
|                 { | ||||
|                     HttpMethod = Method.PUT, | ||||
|                     UrlTemplate = "{+baseurl}/me/drive/special/approot:/{filename}:/content", | ||||
|                     PathParameters = new Dictionary<string, object> | ||||
|                     { | ||||
|                         { "baseurl", client.RequestAdapter.BaseUrl }, | ||||
|                         { "filename", dummyFileName } | ||||
|                     }, | ||||
|                     Content = stream | ||||
|                 }; | ||||
|  | ||||
|                 var uploadedItem = await client.RequestAdapter.SendAsync<DriveItem>( | ||||
|                     uploadRequest, | ||||
|                     DriveItem.CreateFromDiscriminatorValue | ||||
|                 ); | ||||
|  | ||||
|                 var parentId = uploadedItem.ParentReference.Id; | ||||
|  | ||||
|                 var parentItemRequest = new DriveItemRequestBuilder( | ||||
|                     $"{client.RequestAdapter.BaseUrl}/me/drive/items/{parentId}", | ||||
|                     client.RequestAdapter | ||||
|                 ); | ||||
|  | ||||
|                 return await parentItemRequest.GetAsync(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected virtual async Task<List<FileDescription>> ListShares(OneDrive2ItemLocation<OneDrive2PrefixContainerType> parentPath, GraphServiceClient client) | ||||
|         { | ||||
|  | ||||
|             List<FileDescription> result = []; | ||||
| @@ -1345,6 +1393,8 @@ namespace keepass2android.Io | ||||
|  | ||||
|             } | ||||
|         } | ||||
|          | ||||
|          | ||||
|  | ||||
|         protected override async Task<string?> GetSpecialFolder( | ||||
|             OneDrive2ItemLocation<OneDrive2AppFolderPrefixContainer> itemLocation, GraphServiceClient client) | ||||
| @@ -1363,7 +1413,7 @@ namespace keepass2android.Io | ||||
|                     Console.WriteLine(e); | ||||
|                     throw; | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|  | ||||
|             } | ||||
|             return _specialFolderIdByDriveId[itemLocation.DriveId]; | ||||
| @@ -1378,8 +1428,55 @@ namespace keepass2android.Io | ||||
|         { | ||||
|             return drive.Name ?? MyOneDriveDisplayName; | ||||
|         } | ||||
|         public static async Task GetOrCreateAppRootAsync(GraphServiceClient client, string dummyFileName = "welcome_at_kp2a_app_folder.txt") | ||||
|         { | ||||
|  | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 await client.RequestAdapter.SendAsync( | ||||
|                     new Microsoft.Graph.Drives.Item.Items.Item.DriveItemItemRequestBuilder( | ||||
|                         new Dictionary<string, object> { | ||||
|                             { "drive%2Did", "me" }, | ||||
|                             { "driveItem%2Did", "special/approot" } | ||||
|                         }, | ||||
|                         client.RequestAdapter | ||||
|                     ).ToGetRequestInformation(), | ||||
|                     static (p) => DriveItem.CreateFromDiscriminatorValue(p) | ||||
|                 ); | ||||
|                 //if this is successful, approot seems to exist | ||||
|             } | ||||
|             catch (Microsoft.Kiota.Abstractions.ApiException ex) when (ex.ResponseStatusCode == 404) | ||||
|             { | ||||
|                 // App folder doesn’t exist yet → create it by uploading a dummy file | ||||
|                 using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("init")); | ||||
|  | ||||
|                 var uploadRequest = new RequestInformation | ||||
|                 { | ||||
|                     HttpMethod = Method.PUT, | ||||
|                     UrlTemplate = "{+baseurl}/me/drive/special/approot:/{filename}:/content", | ||||
|                     PathParameters = new Dictionary<string, object> | ||||
|                     { | ||||
|                         { "baseurl", client.RequestAdapter.BaseUrl }, | ||||
|                         { "filename", dummyFileName } | ||||
|                     }, | ||||
|                     Content = stream | ||||
|                 }; | ||||
|  | ||||
|                 await client.RequestAdapter.SendAsync<DriveItem>( | ||||
|                     uploadRequest, | ||||
|                     DriveItem.CreateFromDiscriminatorValue | ||||
|                 ); | ||||
|  | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected override async Task<List<FileDescription>> ListShares(OneDrive2ItemLocation<OneDrive2AppFolderPrefixContainer> parentPath, GraphServiceClient client) | ||||
|         { | ||||
|             await GetOrCreateAppRootAsync(client); | ||||
|             return await base.ListShares(parentPath, client); | ||||
|         } | ||||
|  | ||||
|         public override bool CanListShares { get { return false; } } | ||||
|         protected override string MyOneDriveDisplayName => "Keepass2Android App Folder"; | ||||
|     } | ||||
|   | ||||
| @@ -10,19 +10,18 @@ | ||||
|     <Folder Include="Resources\" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="FluentFTP" Version="52.1.0" Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="FluentFTP.GnuTLS" Version="1.0.37" Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="MegaApiClient" Version="1.10.4"  Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="Microsoft.Graph" Version="5.68.0" Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="SMBLibrary" Version="1.5.4" Condition="'$(Flavor)'!='NoNet'"/> | ||||
|     <PackageReference Include="FluentFTP" Version="52.1.0" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <PackageReference Include="MegaApiClient" Version="1.10.4" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <PackageReference Include="Microsoft.Graph" Version="5.68.0" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <PackageReference Include="SMBLibrary" Version="1.5.4" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <PackageReference Include="Xamarin.AndroidX.Browser" Version="1.8.0" /> | ||||
|     <PackageReference Include="Xamarin.AndroidX.Core" Version="1.13.1.5" /> | ||||
|     <PackageReference Include="Xamarin.Google.Android.Material" Version="1.11.0.3" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj" /> | ||||
|     <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" Condition="'$(Flavor)'!='NoNet'"  /> | ||||
|     <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" Condition="'$(Flavor)'!='NoNet'" /> | ||||
|     <ProjectReference Include="..\KeePassLib2Android\KeePassLib2Android.csproj" /> | ||||
|     <ProjectReference Include="..\KP2AKdbLibraryBinding\KP2AKdbLibraryBinding.csproj" /> | ||||
|     <ProjectReference Include="..\TwofishCipher\TwofishCipher.csproj" /> | ||||
| @@ -30,7 +29,7 @@ | ||||
|   <ItemGroup> | ||||
|  | ||||
| </ItemGroup> | ||||
| <ItemGroup  Condition="'$(Flavor)'=='NoNet'"> | ||||
| <ItemGroup Condition="'$(Flavor)'=='NoNet'"> | ||||
|   <None Remove="Io/OneDrive2FileStorage.cs" /> | ||||
|   <Compile Remove="Io/OneDrive2FileStorage.cs" /> | ||||
|   <Content Remove="Io/OneDrive2FileStorage.cs" /> | ||||
|   | ||||
| @@ -12,20 +12,21 @@ namespace KeePass.Util | ||||
|  | ||||
|         public static string GetErrorMessage(Exception e) | ||||
|         { | ||||
|             string errorMessage = e.Message; | ||||
|             if (e is Java.Lang.Exception javaException) | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 try | ||||
|                 string errorMessage = e.Message; | ||||
|                 if (e is Java.Lang.Exception javaException) | ||||
|                 { | ||||
|                     errorMessage = javaException.LocalizedMessage ?? javaException.Message ?? errorMessage; | ||||
|                 } | ||||
|                 finally | ||||
|                 { | ||||
|  | ||||
|                 } | ||||
|                 return errorMessage; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 return ""; | ||||
|             } | ||||
|  | ||||
|             return errorMessage; | ||||
|         } | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -6,8 +6,8 @@ android { | ||||
|  | ||||
|     defaultConfig { | ||||
|         minSdkVersion 21 | ||||
|         targetSdkVersion 33 | ||||
|         compileSdk 34 | ||||
|         targetSdkVersion 35 | ||||
|         compileSdk 35 | ||||
|     } | ||||
|     buildTypes { | ||||
|         release { | ||||
|   | ||||
| @@ -1,2 +1,3 @@ | ||||
| org.gradle.jvmargs=-Xmx1536m | ||||
| android.useAndroidX=true | ||||
| android.jetifier.ignorelist = jsch-2.27.2.jar | ||||
| @@ -3,12 +3,12 @@ apply plugin: 'com.android.application' | ||||
| android { | ||||
|     namespace "com.crocoapps.javafilestoragetest2" | ||||
|  | ||||
|     compileSdkVersion 33 | ||||
|     compileSdkVersion 35 | ||||
|  | ||||
|     defaultConfig { | ||||
|         applicationId "com.crocoapps.javafilestoragetest2" | ||||
|         minSdkVersion 21 | ||||
|         targetSdkVersion 33 | ||||
|         targetSdkVersion 35 | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|         multiDexEnabled true | ||||
| @@ -35,6 +35,7 @@ dependencies { | ||||
|     implementation project(':android-filechooser') | ||||
|     implementation project(':JavaFileStorage') | ||||
|     implementation "androidx.annotation:annotation:1.5.0" | ||||
|     implementation "com.google.android.material:material:1.12.0" | ||||
| } | ||||
|  | ||||
| configurations { | ||||
|   | ||||
| @@ -547,8 +547,8 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag | ||||
| 		//storageToTest = new SkyDriveFileStorage("000000004010C234", appContext); | ||||
|  | ||||
|  | ||||
| 		//storageToTest = new GoogleDriveAppDataFileStorage(); | ||||
| 		storageToTest = new WebDavStorage(new ICertificateErrorHandler() { | ||||
| 		storageToTest = new GoogleDriveAppDataFileStorage(); | ||||
| 		/*storageToTest = new WebDavStorage(new ICertificateErrorHandler() { | ||||
| 			@Override | ||||
| 			public boolean onValidationError(String error) { | ||||
| 				return false; | ||||
| @@ -558,7 +558,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag | ||||
| 			public boolean alwaysFailOnValidationError() { | ||||
| 				return false; | ||||
| 			} | ||||
| 		}, 64*1024); | ||||
| 		}, 64*1024);*/ | ||||
|  | ||||
| 		//storageToTest =  new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); | ||||
| 		//storageToTest =  new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); | ||||
|   | ||||
| @@ -19,9 +19,12 @@ package keepass2android.softkeyboard; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.res.Configuration; | ||||
| import android.content.res.Resources; | ||||
| import android.os.Build; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.util.Log; | ||||
| import android.view.InflateException; | ||||
| import android.view.View; | ||||
| import android.view.WindowInsets; | ||||
|  | ||||
| import java.lang.ref.SoftReference; | ||||
| import java.util.Arrays; | ||||
| @@ -529,6 +532,28 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha | ||||
|                 } | ||||
|             } | ||||
|             mInputView.setOnKeyboardActionListener(mInputMethodService); | ||||
|              | ||||
|             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|                 mInputView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { | ||||
|                     @Override | ||||
|                     public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { | ||||
|                         // Untere Systembar-Höhe holen | ||||
|                         int insetBottom = insets.getSystemWindowInsetBottom(); | ||||
|  | ||||
|                         // Padding nur unten anpassen | ||||
|                         v.setPadding( | ||||
|                                 v.getPaddingLeft(), | ||||
|                                 v.getPaddingTop(), | ||||
|                                 v.getPaddingRight(), | ||||
|                                 insetBottom | ||||
|                         ); | ||||
|  | ||||
|                         // Insets normal weiterreichen | ||||
|                         return insets; | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             mLayoutId = newLayout; | ||||
|         } | ||||
|         mInputMethodService.mHandler.post(new Runnable() { | ||||
|   | ||||
| @@ -4,11 +4,11 @@ android { | ||||
|  | ||||
|     namespace 'group.pals.android.lib.ui.filechooser' | ||||
|  | ||||
|     compileSdkVersion 33 | ||||
|     compileSdkVersion 35 | ||||
|  | ||||
|     defaultConfig { | ||||
|         minSdkVersion 16 | ||||
|         targetSdkVersion 33 | ||||
|         targetSdkVersion 35 | ||||
|     } | ||||
|  | ||||
|     buildTypes { | ||||
| @@ -30,4 +30,5 @@ android { | ||||
|  | ||||
| dependencies { | ||||
|     implementation 'androidx.legacy:legacy-support-v4:1.0.0' | ||||
|     implementation "com.google.android.material:material:1.12.0" | ||||
| } | ||||
|   | ||||
| @@ -20,6 +20,8 @@ import android.content.Context; | ||||
| import android.content.res.Configuration; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
|  | ||||
| import androidx.core.view.WindowCompat; | ||||
| import androidx.fragment.app.FragmentActivity; | ||||
| import android.util.Log; | ||||
| import android.view.KeyEvent; | ||||
| @@ -242,6 +244,7 @@ public class FileChooserActivity extends FragmentActivity { | ||||
|                     R.style.Afc_Theme_Dark)); | ||||
|  | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         setContentView(R.layout.afc_activity_filechooser); | ||||
|         Ui.adjustDialogSizeForLargeScreen(getWindow()); | ||||
|  | ||||
|   | ||||
| @@ -49,6 +49,10 @@ import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
|  | ||||
| import androidx.core.graphics.Insets; | ||||
| import androidx.core.view.ViewCompat; | ||||
| import androidx.core.view.WindowInsetsCompat; | ||||
| import androidx.fragment.app.Fragment; | ||||
| import androidx.loader.app.LoaderManager; | ||||
| import androidx.loader.content.CursorLoader; | ||||
| @@ -324,6 +328,19 @@ public class FragmentFiles extends Fragment implements | ||||
|          * INIT CONTROLS | ||||
|          */ | ||||
|  | ||||
|         ViewCompat.setOnApplyWindowInsetsListener(rootView, (v, windowInsets) -> { | ||||
|             Insets systemBarsInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.navigationBars() | WindowInsetsCompat.Type.ime()); | ||||
|  | ||||
|  | ||||
|             v.setPadding( | ||||
|                     systemBarsInsets.left, | ||||
|                     systemBarsInsets.top, | ||||
|                     systemBarsInsets.right, | ||||
|                     systemBarsInsets.bottom | ||||
|             ); | ||||
|  | ||||
|             return WindowInsetsCompat.CONSUMED; | ||||
|         }); | ||||
|          | ||||
|         return rootView; | ||||
|     }// onCreateView() | ||||
|   | ||||
| @@ -8,8 +8,6 @@ | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_light_pressed" android:state_pressed="true"/> | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_light_focused" android:state_focused="true"/> | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_light"/> | ||||
|     <item android:drawable="@drawable/save_icon"/> | ||||
|  | ||||
| </selector> | ||||
| @@ -8,8 +8,6 @@ | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_dark_pressed" android:state_pressed="true"/> | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_dark_focused" android:state_focused="true"/> | ||||
|     <item android:drawable="@drawable/afc_ic_button_ok_saveas_dark"/> | ||||
|     <item android:drawable="@drawable/save_icon"/> | ||||
|  | ||||
| </selector> | ||||
| @@ -0,0 +1,16 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <!-- Disabled --> | ||||
|     <item android:state_enabled="false" | ||||
|                 android:drawable="@drawable/baseline_chevron_left_24_alpha30" /> | ||||
|     <!-- Default --> | ||||
|     <item android:drawable="@drawable/baseline_chevron_left_24" /> | ||||
| </selector> | ||||
| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_pressed_dark" android:state_pressed="true"/> <!-- pressed --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_disabled_dark" android:state_enabled="false"/> <!-- enabled --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_dark"/> <!-- default --> | ||||
|  | ||||
| </selector> | ||||
| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_pressed_light" android:state_pressed="true"/> <!-- pressed --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_disabled_light" android:state_enabled="false"/> <!-- enabled --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_left_light"/> <!-- default --> | ||||
|  | ||||
| </selector> | ||||
| @@ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <!-- Disabled --> | ||||
|     <item android:state_enabled="false" | ||||
|                 android:drawable="@drawable/baseline_chevron_right_24_alpha30" /> | ||||
|     <!-- Default --> | ||||
|     <item android:drawable="@drawable/baseline_chevron_right_24" /> | ||||
| </selector> | ||||
| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_pressed_dark" android:state_pressed="true"/> <!-- pressed --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_disabled_dark" android:state_enabled="false"/> <!-- enabled --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_dark"/> <!-- default --> | ||||
|  | ||||
| </selector> | ||||
| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_pressed_light" android:state_pressed="true"/> <!-- pressed --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_disabled_light" android:state_enabled="false"/> <!-- enabled --> | ||||
|     <item android:drawable="@drawable/afc_main_button_navi_right_light"/> <!-- default --> | ||||
|  | ||||
| </selector> | ||||
| @@ -0,0 +1,8 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
| android:height="36dp" android:tint="?attr/colorOnSurface" | ||||
| android:viewportHeight="24" android:viewportWidth="24" | ||||
|  android:width="36dp"> | ||||
|        | ||||
|     <path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/> | ||||
|      | ||||
| </vector> | ||||
| @@ -0,0 +1,8 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
| android:height="36dp" android:tint="?attr/colorOnSurface" | ||||
| android:viewportHeight="24" android:viewportWidth="24" | ||||
|  android:width="36dp"> | ||||
|        | ||||
|     <path android:fillColor="@android:color/white" android:fillAlpha="0.3" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/> | ||||
|      | ||||
| </vector> | ||||
| @@ -0,0 +1,8 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
| android:height="36dp" android:tint="?attr/colorOnSurface" | ||||
| android:viewportHeight="24" android:viewportWidth="24" | ||||
|  android:width="36dp"> | ||||
|   | ||||
|     <path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/> | ||||
|      | ||||
| </vector> | ||||
| @@ -0,0 +1,8 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
| android:height="36dp" android:tint="?attr/colorOnSurface" | ||||
| android:viewportHeight="24" android:viewportWidth="24" | ||||
|  android:width="36dp"> | ||||
|   | ||||
|     <path android:fillColor="@android:color/white" android:fillAlpha="0.3" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/> | ||||
|      | ||||
| </vector> | ||||
| @@ -0,0 +1,8 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
| android:height="36dp" android:tint="?attr/colorOnSurface" | ||||
| android:viewportHeight="24" android:viewportWidth="24" | ||||
|  android:width="36dp"> | ||||
|        | ||||
|     <path android:fillColor="@android:color/white" android:pathData="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/> | ||||
|      | ||||
| </vector> | ||||
| @@ -42,9 +42,9 @@ | ||||
|         android:layout_width="0dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_gravity="center_vertical" | ||||
|         android:layout_marginBottom="@dimen/afc_2dp" | ||||
|         android:layout_marginTop="@dimen/afc_5dp" | ||||
|         android:layout_marginBottom="@dimen/afc_5dp" | ||||
|         android:layout_marginRight="@dimen/afc_5dp" | ||||
|         android:layout_marginTop="@dimen/afc_2dp" | ||||
|         android:layout_weight="0.1" | ||||
|         android:orientation="vertical" > | ||||
|  | ||||
| @@ -55,8 +55,8 @@ | ||||
|             android:ellipsize="middle" | ||||
|             android:maxLines="3" | ||||
|             android:singleLine="false" | ||||
|             android:textAppearance="?android:attr/textAppearanceMedium" | ||||
|             android:textIsSelectable="false" /> | ||||
|             android:textIsSelectable="false" | ||||
|             android:textAppearance="@style/TextAppearance.Material3.BodyLarge"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/afc_textview_file_info" | ||||
| @@ -66,7 +66,8 @@ | ||||
|             android:ellipsize="end" | ||||
|             android:gravity="right" | ||||
|             android:singleLine="true" | ||||
|             android:textIsSelectable="false" /> | ||||
|             android:textIsSelectable="false" | ||||
|             android:textAppearance="@style/TextAppearance.Material3.BodySmall" /> | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <CheckBox | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|  | ||||
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" > | ||||
|     android:layout_height="match_parent"> | ||||
|  | ||||
|     <RelativeLayout | ||||
|         android:id="@+id/afc_viewgroup_header" | ||||
| @@ -47,21 +47,14 @@ | ||||
|                     android:layout_height="match_parent" | ||||
|                     android:layout_gravity="center_vertical" | ||||
|                     android:orientation="horizontal" | ||||
|                     android:showDividers="middle" /> | ||||
|                     /> | ||||
|             </HorizontalScrollView> | ||||
|  | ||||
|             <View | ||||
|                 android:id="@+id/afc_header_view_divider" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="@dimen/afc_viewgroup_button_locations_bottom_divider_height" | ||||
|                 android:layout_below="@id/afc_view_locations_container" | ||||
|                 android:background="@color/afc_border_line_dark" /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/afc_textview_full_dir_name" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_below="@id/afc_header_view_divider" | ||||
|                 android:layout_below="@id/afc_view_locations_container" | ||||
|                 android:layout_centerHorizontal="true" | ||||
|                 android:ellipsize="start" | ||||
|                 android:gravity="center" | ||||
| @@ -122,10 +115,6 @@ | ||||
|         android:orientation="vertical" | ||||
|         android:visibility="gone" > | ||||
|  | ||||
|         <View | ||||
|             android:id="@+id/afc_footer_view_divider" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="@dimen/afc_viewgroup_button_locations_bottom_divider_height" /> | ||||
|  | ||||
|         <LinearLayout | ||||
|             android:id="@+id/afc_viewgroup_footer" | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
| <ListView xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:divider="@null" | ||||
|     android:dividerHeight="0dp" | ||||
|     android:fastScrollEnabled="true" > | ||||
|  | ||||
| </ListView> | ||||
| @@ -0,0 +1,21 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
|  | ||||
| <resources xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <style name="Afc.BaseTheme.Dark" parent="Theme.Material3.Dark.NoActionBar"> | ||||
|         <item name="android:windowLightStatusBar">false</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Dark" parent="Theme.Material3.Dark.NoActionBar"> | ||||
|         <item name="android:windowLightStatusBar">false</item> | ||||
|     </style> | ||||
|  | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Light" parent="Theme.Material3.Light.NoActionBar"> | ||||
|     <item name="android:windowLightStatusBar">true</item> | ||||
|     </style> | ||||
|      | ||||
|     <style name="Afc.BaseTheme.Light" parent="Theme.Material3.Light.NoActionBar"> | ||||
|         <item name="android:windowLightStatusBar">true</item> | ||||
|     </style> | ||||
| </resources>     | ||||
| @@ -1,63 +1,55 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
|     Copyright (c) 2012 Hai Bison | ||||
|  | ||||
|     See the file LICENSE at the root directory of this project for copying | ||||
|     permission. | ||||
| --> | ||||
|  | ||||
| <resources xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <style name="AOSP_DialogWindowTitle"> | ||||
|         <style name="AOSP_DialogWindowTitle"> | ||||
|         <item name="android:maxLines">1</item> | ||||
|         <item name="android:scrollHorizontally">true</item> | ||||
|         <item name="android:textAppearance">@android:style/TextAppearance.DialogWindowTitle</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_main_button_navi"> | ||||
|         <style name="afc_main_button_navi"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:adjustViewBounds">true</item> | ||||
|         <item name="android:scaleType">center</item> | ||||
|         <item name="android:layout_marginLeft">@dimen/afc_5dp</item> | ||||
|         <item name="android:layout_marginTop">@dimen/afc_5dp</item> | ||||
|         <item name="android:layout_gravity">center</item> | ||||
| <item name="android:layout_gravity">center</item> | ||||
|         <item name="android:minHeight">@dimen/afc_button_navigators_min_height</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_main_button_navi_left" parent="@style/afc_main_button_navi"> | ||||
|         <item name="android:src">?attr/afc_selector_main_button_navi_left</item> | ||||
|     </style> | ||||
|             </style> | ||||
|  | ||||
|     <style name="afc_main_button_navi_right" parent="@style/afc_main_button_navi"> | ||||
|         <item name="android:src">?attr/afc_selector_main_button_navi_right</item> | ||||
|         <item name="android:layout_marginRight">@dimen/afc_5dp</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_action_navi"> | ||||
|         <style name="afc_action_navi"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:adjustViewBounds">true</item> | ||||
|         <item name="android:scaleType">center</item> | ||||
|         <item name="android:background">?attr/afc_selector_image_button</item> | ||||
| <item name="android:background">?attr/afc_selector_image_button</item> | ||||
|         <item name="android:layout_margin">@dimen/afc_2dp</item> | ||||
|         <item name="android:layout_gravity">center</item> | ||||
| <item name="android:layout_gravity">center</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_action_navi_left" parent="@style/afc_action_navi"> | ||||
|         <item name="android:src">?attr/afc_selector_action_navi_left_foreground</item> | ||||
|     </style> | ||||
|             </style> | ||||
|  | ||||
|     <style name="afc_action_navi_right" parent="@style/afc_action_navi"> | ||||
|         <item name="android:src">?attr/afc_selector_action_navi_right_foreground</item> | ||||
|     </style> | ||||
|             </style> | ||||
|  | ||||
|     <style name="afc_base_button_location" parent="@android:style/Widget.TextView"></style> | ||||
|  | ||||
|     <style name="afc_button_location" parent="@style/afc_base_button_location"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">match_parent</item> | ||||
|         <item name="android:layout_gravity">center_vertical</item> | ||||
| <item name="android:layout_gravity">center_vertical</item> | ||||
|         <item name="android:background">?attr/afc_selector_button_location</item> | ||||
|         <item name="android:layout_margin">@dimen/afc_5dp</item> | ||||
|         <item name="android:ellipsize">end</item> | ||||
| @@ -65,11 +57,11 @@ | ||||
|         <item name="android:minWidth">@dimen/afc_button_location_min_width</item> | ||||
|         <item name="android:padding">@dimen/afc_5dp</item> | ||||
|         <item name="android:singleLine">true</item> | ||||
|         <item name="android:gravity">center</item> | ||||
| <item name="android:gravity">center</item> | ||||
|         <item name="android:textAppearance">?android:attr/textAppearanceMedium</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_widget_search_view_button_search"> | ||||
|         <style name="afc_widget_search_view_button_search"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:background">?attr/afc_selector_image_button</item> | ||||
| @@ -80,10 +72,10 @@ | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:background">@null</item> | ||||
|         <item name="android:src">?attr/afc_ic_widget_search_view_action_clear</item> | ||||
| <item name="android:src">?attr/afc_ic_widget_search_view_action_clear</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_button_sort" parent="@android:style/Widget.ImageButton"> | ||||
|         <style name="afc_button_sort" parent="@android:style/Widget.ImageButton"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:layout_gravity">center</item> | ||||
| @@ -91,11 +83,11 @@ | ||||
|         <item name="android:padding">@dimen/afc_5dp</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="afc_home_button_navigators" parent="@android:style/Widget.TextView"> | ||||
|         <style name="afc_home_button_navigators" parent="@android:style/Widget.TextView"> | ||||
|         <item name="android:layout_width">wrap_content</item> | ||||
|         <item name="android:layout_height">wrap_content</item> | ||||
|         <item name="android:gravity">center</item> | ||||
|         <item name="android:background">?attr/afc_selector_button_location</item> | ||||
| <item name="android:background">?attr/afc_selector_button_location</item> | ||||
|         <item name="android:layout_margin">@dimen/afc_2dp</item> | ||||
|         <item name="android:layout_gravity">center_vertical</item> | ||||
|         <item name="android:textAppearance">?android:attr/textAppearanceMedium</item> | ||||
|   | ||||
| @@ -16,7 +16,7 @@ | ||||
|     - Actual themes which extend BaseThemeHelpers: contain customizations that are the same for all API levels. | ||||
|     --> | ||||
|  | ||||
|     <style name="Afc.BaseTheme.Dark" parent="@android:style/Theme"></style> | ||||
|     <style name="Afc.BaseTheme.Dark" parent="Theme.Material3.Dark.NoActionBar"></style> | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Dark" parent="@style/Afc.BaseTheme.Dark"> | ||||
|         <item name="afc_ic_menu_home">@drawable/afc_ic_menu_home</item> | ||||
| @@ -39,15 +39,13 @@ | ||||
|         <item name="afc_ic_widget_search_view_action_clear">@drawable/afc_ic_action_clear_dark</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Afc.BaseTheme.Dialog.Dark" parent="@android:style/Theme" /> | ||||
|     <style name="Afc.BaseTheme.Dialog.Dark" parent="Theme.Material3.Dark.NoActionBar" /> | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Dialog.Dark" parent="@style/Afc.BaseTheme.Dialog.Dark"> | ||||
|  | ||||
|         <!-- AOSP --> | ||||
|  | ||||
|         <item name="android:windowFrame">@null</item> | ||||
|         <item name="android:windowTitleStyle">@style/AOSP_DialogWindowTitle</item> | ||||
|         <item name="android:windowBackground">@drawable/aosp_dialog_full_holo_dark</item> | ||||
|         <item name="android:windowIsFloating">true</item> | ||||
|         <item name="android:windowContentOverlay">@null</item> | ||||
|         <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> | ||||
| @@ -81,10 +79,6 @@ | ||||
|  | ||||
|     <style name="Afc.Theme.Dark" parent="@style/Afc.BaseThemeHelper.Dark"> | ||||
|  | ||||
|         <!-- AOSP --> | ||||
|  | ||||
|         <item name="android:windowBackground">@drawable/aosp_background_holo_dark</item> | ||||
|  | ||||
|         <!-- android-filechooser --> | ||||
|  | ||||
|         <item name="afc_theme_dialog">@style/Afc.Theme.Dialog.Dark</item> | ||||
| @@ -93,9 +87,9 @@ | ||||
|         <item name="afc_badge_file_provider_localfile">@drawable/afc_badge_file_provider_localfile_light</item> | ||||
|         <item name="afc_selector_image_button">@drawable/afc_selector_image_button_dark</item> | ||||
|         <item name="afc_selector_button_location">@drawable/afc_selector_button_location_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right_dark</item> | ||||
|         <item name="afc_selector_button_ok_saveas">@drawable/afc_selector_button_ok_saveas_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right</item> | ||||
|         <item name="afc_selector_button_ok_saveas">@drawable/save_icon</item> | ||||
|         <item name="afc_selector_action_navi_left_foreground">@drawable/afc_selector_action_navi_left_dark_foreground</item> | ||||
|         <item name="afc_selector_action_navi_right_foreground">@drawable/afc_selector_action_navi_right_dark_foreground</item> | ||||
|         <item name="afc_color_listview_cache_hint">@color/afc_listview_cache_hint_dark</item> | ||||
| @@ -109,8 +103,8 @@ | ||||
|         <item name="afc_badge_file_provider_localfile">@drawable/afc_badge_file_provider_localfile_light</item> | ||||
|         <item name="afc_selector_image_button">@drawable/afc_selector_image_button_dark</item> | ||||
|         <item name="afc_selector_button_location">@drawable/afc_selector_button_location_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right_dark</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right</item> | ||||
|         <item name="afc_selector_button_ok_saveas">@drawable/afc_selector_button_ok_saveas_dark</item> | ||||
|         <item name="afc_selector_action_navi_left_foreground">@drawable/afc_selector_action_navi_left_dark_foreground</item> | ||||
|         <item name="afc_selector_action_navi_right_foreground">@drawable/afc_selector_action_navi_right_dark_foreground</item> | ||||
|   | ||||
| @@ -16,9 +16,11 @@ | ||||
|     - Actual themes which extend BaseThemeHelpers: contain customizations that are the same for all API levels. | ||||
|     --> | ||||
|  | ||||
|     <style name="Afc.BaseTheme.Light" parent="@android:style/Theme.Light"></style> | ||||
|     <style name="Afc.BaseTheme.Light" parent="Theme.Material3.Light.NoActionBar"> | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Light" parent="@style/Afc.BaseTheme.Light"> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Afc.BaseThemeHelper.Light" parent="Theme.Material3.Light.NoActionBar"> | ||||
|         <item name="afc_ic_menu_home">@drawable/afc_ic_menu_home</item> | ||||
|         <item name="afc_ic_menu_gridview">@drawable/afc_ic_menu_gridview</item> | ||||
|         <item name="afc_ic_menu_listview">@drawable/afc_ic_menu_listview</item> | ||||
| @@ -46,7 +48,6 @@ | ||||
|  | ||||
|         <item name="android:windowFrame">@null</item> | ||||
|         <item name="android:windowTitleStyle">@style/AOSP_DialogWindowTitle</item> | ||||
|         <item name="android:windowBackground">@drawable/aosp_dialog_full_holo_light</item> | ||||
|         <item name="android:windowIsFloating">true</item> | ||||
|         <item name="android:windowContentOverlay">@null</item> | ||||
|         <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> | ||||
| @@ -78,11 +79,6 @@ | ||||
|     </style> | ||||
|  | ||||
|     <style name="Afc.Theme.Light" parent="@style/Afc.BaseThemeHelper.Light"> | ||||
|  | ||||
|         <!-- AOSP --> | ||||
|  | ||||
|         <item name="android:windowBackground">@drawable/aosp_background_holo_light</item> | ||||
|  | ||||
|         <!-- android-filechooser --> | ||||
|  | ||||
|         <item name="afc_theme_dialog">@style/Afc.Theme.Dialog.Light</item> | ||||
| @@ -92,8 +88,8 @@ | ||||
|         <item name="afc_badge_file_provider_localfile">@drawable/afc_badge_file_provider_localfile_dark</item> | ||||
|         <item name="afc_selector_image_button">@drawable/afc_selector_image_button_light</item> | ||||
|         <item name="afc_selector_button_location">@drawable/afc_selector_button_location_light</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left_light</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right_light</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right</item> | ||||
|         <item name="afc_selector_button_ok_saveas">@drawable/afc_selector_button_ok_saveas_light</item> | ||||
|         <item name="afc_selector_action_navi_left_foreground">@drawable/afc_selector_action_navi_left_light_foreground</item> | ||||
|         <item name="afc_selector_action_navi_right_foreground">@drawable/afc_selector_action_navi_right_light_foreground</item> | ||||
| @@ -120,8 +116,8 @@ | ||||
|         <item name="afc_badge_file_provider_localfile">@drawable/afc_badge_file_provider_localfile_dark</item> | ||||
|         <item name="afc_selector_image_button">@drawable/afc_selector_image_button_light</item> | ||||
|         <item name="afc_selector_button_location">@drawable/afc_selector_button_location_light</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left_light</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right_light</item> | ||||
|         <item name="afc_selector_main_button_navi_left">@drawable/afc_selector_main_button_navi_left</item> | ||||
|         <item name="afc_selector_main_button_navi_right">@drawable/afc_selector_main_button_navi_right</item> | ||||
|         <item name="afc_selector_button_ok_saveas">@drawable/afc_selector_button_ok_saveas_light</item> | ||||
|         <item name="afc_selector_action_navi_left_foreground">@drawable/afc_selector_action_navi_left_light_foreground</item> | ||||
|         <item name="afc_selector_action_navi_right_foreground">@drawable/afc_selector_action_navi_right_light_foreground</item> | ||||
|   | ||||
| @@ -31,9 +31,15 @@ namespace keepass2android | ||||
| 			MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(ctx); | ||||
| 			builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title)); | ||||
| 			List<string> changeLog = new List<string>{ | ||||
| 				#if !NoNet | ||||
| 				BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_14_net}, "1.14"), | ||||
| 				#endif | ||||
| 				 | ||||
| 				BuildChangelogString(ctx, new List<int> | ||||
|                 { | ||||
| 					Resource.Array.ChangeLog_1_14, | ||||
| #if !NoNet | ||||
|                     Resource.Array.ChangeLog_1_14_net | ||||
| #endif | ||||
|                 }, "1.14"), | ||||
| 				 | ||||
|  | ||||
|                 BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_13}, "1.13"), | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|       android:versionCode="224" | ||||
|       android:versionName="1.14-pre1" | ||||
|       android:versionCode="236" | ||||
|       android:versionName="1.14-pre3" | ||||
|       package="keepass2android.keepass2android" | ||||
|       xmlns:tools="http://schemas.android.com/tools" | ||||
|       android:installLocation="auto"> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|       android:versionCode="224" | ||||
|       android:versionName="1.14-pre1" | ||||
|       android:versionCode="236" | ||||
|       android:versionName="1.14-pre3" | ||||
|       package="keepass2android.keepass2android_nonet" | ||||
|       xmlns:tools="http://schemas.android.com/tools" | ||||
|       android:installLocation="auto"> | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| 			xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|             android:layout_width="fill_parent" | ||||
|             android:layout_height="fill_parent" | ||||
| 			android:fitsSystemWindows="true" | ||||
|       android:id="@+id/root" | ||||
| 			android:layout_margin="12dip"> | ||||
| 	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|   | ||||
| @@ -732,7 +732,6 @@ | ||||
|   <string-array name="ChangeLog_1_14_net"> | ||||
|     <item>Vylepšení WebDav: Oprava chyby při zobrazování seznamu složek; podpora fragmentovaných nahrávání a transakcí</item> | ||||
|     <item>Přidána podpora pro Sambu/síťové sdílení Windows</item> | ||||
|     <item>Aktualizován FluentFTP a povolena podpora pro GnuTLS stream, podporující TLS 1.3 a řešící další problémy FTPS</item> | ||||
|   </string-array> | ||||
|   <string-array name="ChangeLog_1_13"> | ||||
|     <item>Vylepšené hodnocení kvality hesel založené na nejčastěji používaných heslech.</item> | ||||
|   | ||||
| @@ -732,7 +732,6 @@ Anbei einige Tipps, die bei der Diagnose des Problems helfen können:\n | ||||
|   <string-array name="ChangeLog_1_14_net"> | ||||
|     <item>WebDav-Verbesserungen: Fehlerbehebung für die Ordnerauflistung; Unterstützung für chunked Uploads und Transaktionen</item> | ||||
|     <item>Unterstützung für Samba/Windows-Netzwerkfreigaben hinzugefügt</item> | ||||
|     <item>FluentFTP aktualisiert und Unterstützung für GnuTLS Stream aktiviert, TLS 1.3 wird unterstützt und andere FTPS Probleme gelöst</item> | ||||
|   </string-array> | ||||
|   <string-array name="ChangeLog_1_13"> | ||||
|     <item>Verbesserte Einschätzung der Passwortqualität, indem die beliebtesten Passwörter berücksichtigt werden.</item> | ||||
|   | ||||
| @@ -734,7 +734,6 @@ | ||||
|   <string-array name="ChangeLog_1_14_net"> | ||||
|     <item>Améliorations de WebDav : Correction d\'un bogue pour l\'énumération des dossiers ; prise en charge des téléchargements et des transactions par morceaux.</item> | ||||
|     <item>Ajout de la prise en charge des partages réseau Samba/Windows</item> | ||||
|     <item>Mise à jour de FluentFTP et la prise en charge du flux GnuTLS, supportant TLS 1.3 et résolvant d\'autres problèmes FTPS</item> | ||||
|   </string-array> | ||||
|   <string-array name="ChangeLog_1_13"> | ||||
|     <item>Estimation de la qualité du mot de passe améliorée en tenant compte des mots de passe les plus populaires.</item> | ||||
|   | ||||
| @@ -736,7 +736,6 @@ | ||||
|   <string-array name="ChangeLog_1_14_net"> | ||||
|     <item>Melhorias no WebDav: Correção de bug ao listar pastas; Suporte para uploads e transações em blocos</item> | ||||
|     <item>Adicionado suporte para compartilhamentos de rede Samba/Windows</item> | ||||
|     <item>Atualizado o FluentFTP e habilitado o suporte para o fluxo GnuTLS, suportando o TLS 1.3 e resolvendo outros problemas de FTPS</item> | ||||
|   </string-array> | ||||
|   <string-array name="ChangeLog_1_13"> | ||||
|     <item>Estimativa aprimorada da qualidade da senha, considerando a maioria das senhas populares.</item> | ||||
|   | ||||
| @@ -741,10 +741,14 @@ | ||||
|   <string name="webdav_chunked_upload_size_title">Chunk size for WebDav upload</string> | ||||
|   <string name="webdav_chunked_upload_size_summary">Size of chunks when uploading to WebDav servers in bytes. Use 0 to disable chunked upload.</string> | ||||
|  | ||||
|   <string-array name="ChangeLog_1_14"> | ||||
|     <item>Update to .net 9 and Target SDK version 35. This comes with transparent status bar on Android 15 because edge-to-edge is now the default.</item> | ||||
|     <item>Minor UI improvements</item> | ||||
|   </string-array> | ||||
|  | ||||
|   <string-array name="ChangeLog_1_14_net"> | ||||
|     <item>WebDav improvements: Bug fix for listing folders; support for chunked uploads and transactions</item> | ||||
|     <item>Added support for Samba/Windows network shares</item> | ||||
|     <item>Updated FluentFTP and enabled support for GnuTLS stream, supporting TLS 1.3 and solving other FTPS issues</item> | ||||
|     <item>Updated JSch to support more modern algorithms in SFTP</item> | ||||
|   </string-array> | ||||
|  | ||||
|   | ||||
| @@ -131,7 +131,15 @@ namespace keepass2android.view | ||||
| 		    ev.FindViewById(Resource.Id.icon).Visibility = ViewStates.Visible; | ||||
| 		    ev.FindViewById(Resource.Id.check_mark).Visibility = ViewStates.Invisible; | ||||
|  | ||||
| 		    _db = App.Kp2a.FindDatabaseForElement(_entry); | ||||
| 		    _db = App.Kp2a.TryFindDatabaseForElement(_entry); | ||||
|             if (_db == null) | ||||
|             { | ||||
|                 ev.FindViewById(Resource.Id.icon).Visibility = ViewStates.Gone; | ||||
|                 _textView.TextFormatted = new SpannableString("(no data)"); | ||||
|                 _textviewDetails.Visibility = ViewStates.Gone; | ||||
|                 _textgroupFullPath.Visibility = ViewStates.Gone; | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             ImageView iv = (ImageView)ev.FindViewById(Resource.Id.icon); | ||||
| 			bool isExpired = pw.Expires && pw.ExpiryTime < DateTime.Now; | ||||
| @@ -209,11 +217,6 @@ namespace keepass2android.view | ||||
|             UpdateTotp(); | ||||
|              | ||||
|  | ||||
|             | ||||
|                  | ||||
|  | ||||
|              | ||||
|  | ||||
|         } | ||||
| 		 | ||||
| 		public void ConvertView(PwEntry pw, int pos) | ||||
|   | ||||
| @@ -15,14 +15,15 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file | ||||
|   along with Keepass2Android.  If not, see <http://www.gnu.org/licenses/>. | ||||
|   */ | ||||
|  | ||||
| using System; | ||||
| using Android.Graphics; | ||||
| using Android.OS; | ||||
| using Android.Runtime; | ||||
| using Android.Text; | ||||
| using Android.Views; | ||||
| using Android.Widget; | ||||
| using keepass2android; | ||||
| using KeePassLib; | ||||
| using System; | ||||
| using Object = Java.Lang.Object; | ||||
|  | ||||
| namespace keepass2android.view | ||||
| @@ -64,7 +65,20 @@ namespace keepass2android.view | ||||
| 			_label = (TextView) gv.FindViewById(Resource.Id.group_label); | ||||
| 			_label.TextSize = size-8; | ||||
|  | ||||
| 		    Database db = App.Kp2a.FindDatabaseForElement(pw); | ||||
| 		    Database db = App.Kp2a.TryFindDatabaseForElement(pw); | ||||
|  | ||||
|              | ||||
|             if (db == null) | ||||
|             { | ||||
|  | ||||
|                 gv.FindViewById(Resource.Id.group_icon_bkg).Visibility = ViewStates.Gone; | ||||
|  | ||||
|                 gv.FindViewById(Resource.Id.icon).Visibility = ViewStates.Gone; | ||||
|                 gv.FindViewById(Resource.Id.check_mark).Visibility = ViewStates.Invisible; | ||||
|                 _textview.Text = "(no data)"; | ||||
|                 _label.Text = ""; | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             gv.FindViewById(Resource.Id.group_icon_bkg).Visibility = db.DrawableFactory.IsWhiteIconSet ? ViewStates.Visible : ViewStates.Gone; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user