diff --git a/Source/Datafiles/Designs/icons8-24-64.png b/Source/Datafiles/Designs/icons8_24_64.png similarity index 100% rename from Source/Datafiles/Designs/icons8-24-64.png rename to Source/Datafiles/Designs/icons8_24_64.png diff --git a/Source/Datafiles/Designs/icons8-flagpole-64.png b/Source/Datafiles/Designs/icons8_flagpole_64.png similarity index 100% rename from Source/Datafiles/Designs/icons8-flagpole-64.png rename to Source/Datafiles/Designs/icons8_flagpole_64.png diff --git a/Source/Datafiles/Designs/javascript.js b/Source/Datafiles/Designs/javascript.js index 0322b1f3..d93cec60 100644 --- a/Source/Datafiles/Designs/javascript.js +++ b/Source/Datafiles/Designs/javascript.js @@ -1,6 +1,6 @@ //MIT License -//Copyright (c) 2018-2022 Peter Kirmeier +//Copyright (c) 2018-2023 Peter Kirmeier //Permission is hereby granted, free of charge, to any person obtaining a copy //of this software and associated documentation files (the "Software"), to deal @@ -59,8 +59,8 @@ function IntToStringSigned(i) { if (i == 0) return '0'; else if (i > 0) return ' function ShowCrossOrCheckMark(i) { return ''; } -function ShowSessionProgress() { return ''; } -function ShowBestProgress() { return ''; } +function ShowSessionProgress() { return ''; } +function ShowBestProgress() { return ''; } function OffsetTimerTick() { if (offset_timer_tick_callback != undefined) offset_timer_tick_callback(Date.now() - offset_timer_start); } diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props new file mode 100644 index 00000000..da3f583f --- /dev/null +++ b/Source/Directory.Build.props @@ -0,0 +1,25 @@ + + + + 2.0.0.0 + HitCounterManager + + $(Version) + $(Version) + $(Product) + Manages a hit counter + en + + Peter Kirmeier + + Copyright © $(Authors) $([System.DateTime]::Now.Year) + + enable + + + + + + 11.0.5 + + diff --git a/Source/GenerateThirdPartyLicense.sh b/Source/GenerateThirdPartyLicense.sh index b3698c9e..1073b8b5 100644 --- a/Source/GenerateThirdPartyLicense.sh +++ b/Source/GenerateThirdPartyLicense.sh @@ -142,14 +142,16 @@ EOF echo Fetching NuGet packages 1>&2 LICENSES="" -NUGET_PACKAGES_DIR=$(dotnet nuget locals -l global-packages | sed -e 's,^[^ ]* ,,') -NUGET_PACKAGES_SPECS=$(dotnet list $(pwd)/HitCounterManager.sln package --include-transitive | grep ">" | sed -e 's,^[^>]*>[ \t]*\([^ ^\t]*\)[ \t]*\([^ ^\t]*\).*,\L\1/\2/\L\1.nuspec,' | xargs) +NUGET_PACKAGES_DIR=$(dotnet nuget locals -l global-packages | sed -e 's,^[^ ]* ,,' -e 's,[ \t/\\]*$,,' -e 's,\\,/,g') +NUGET_PACKAGES_SPECS=$(dotnet list $(pwd)/HitCounterManager.sln package --include-transitive --format json | grep -e '"id":\|"resolvedVersion":' | sed -e 's,.*: "\(.*\)"\,*$,\1,' | xargs -n2 -d'\n' | sed -e 's,\([^ ]*\) \(.*\),\L\1/\2/\L\1.nuspec,') echo Printing NuGet packages 1>&2 -for nuspec in ${NUGET_PACKAGES_SPECS}; +for nuspec in ${NUGET_PACKAGES_SPECS} do - xml="${NUGET_PACKAGES_DIR}/${nuspec}" + # (a) seems to be filler expression to whatever version is available, try detect folder using shell's star autocompletion + xml="$(echo ${NUGET_PACKAGES_DIR}/${nuspec} | sed -e 's,/(a)/,/*/,g')" + id=$(grepkey id "${xml}") echo ============================================================================== echo NuGet Package: ${id} $(grepkey version "${xml}") @@ -174,13 +176,20 @@ do if [ ! -z ${GITHUB_RAWURL} ] ; then lic=${GITHUB_RAWURL} fi - echo License: ${lic} - LICENSES="${LICENSES} ${lic}" + # Split dual licences + if [ "${lic}" = "https://licenses.nuget.org/MIT%20AND%20Apache-2.0" ] ; then + lic="https://licenses.nuget.org/MIT https://licenses.nuget.org/Apache-2.0" + fi + for lic in ${lic} + do + echo License: ${lic} + LICENSES="${LICENSES} ${lic}" + done done echo Printing NuGet licenses 1>&2 -for lic in $(echo $LICENSES | xargs -n 1 echo | sort -u) ; +for lic in $(echo $LICENSES | xargs -n 1 echo | sort -u) do if [ "${lic}" = "https://licenses.nuget.org/MIT" ] ; then # MIT is already attached above diff --git a/Source/HitCounterManager.Android/HitCounterManager.Android.csproj b/Source/HitCounterManager.Android/HitCounterManager.Android.csproj new file mode 100644 index 00000000..028a6e0c --- /dev/null +++ b/Source/HitCounterManager.Android/HitCounterManager.Android.csproj @@ -0,0 +1,32 @@ + + + + net7.0-android + + + Exe + $(Product).Android + + + 21 + com.peterkirmeier.$(Product) + 1 + 1.0 + apk + False + + + + + Resources\drawable\Icon.png + + + + + + + + + + + diff --git a/Source/HitCounterManager.Android/HitCounterManager.Android.csproj.user b/Source/HitCounterManager.Android/HitCounterManager.Android.csproj.user new file mode 100644 index 00000000..b31f0e2e --- /dev/null +++ b/Source/HitCounterManager.Android/HitCounterManager.Android.csproj.user @@ -0,0 +1,9 @@ + + + + pixel_5_-_api_34 + Emulator + Pixel 5 - API 34 (Android 14.0 - API 34) + pixel_5_-_api_34 + + \ No newline at end of file diff --git a/Source/HitCounterManager.Android/Icon.png b/Source/HitCounterManager.Android/Icon.png new file mode 100644 index 00000000..41a2a618 Binary files /dev/null and b/Source/HitCounterManager.Android/Icon.png differ diff --git a/Source/HitCounterManager.Android/MainActivity.cs b/Source/HitCounterManager.Android/MainActivity.cs new file mode 100644 index 00000000..426689d2 --- /dev/null +++ b/Source/HitCounterManager.Android/MainActivity.cs @@ -0,0 +1,92 @@ +using Android.App; +using Android.Content.PM; +using Avalonia; +using Avalonia.Android; +using Avalonia.ReactiveUI; + +namespace HitCounterManager.Android; + +[Activity( + Label = "HitCounterManager.Android", + Theme = "@style/MyTheme.NoActionBar", + Icon = "@drawable/icon", + MainLauncher = true, + ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] +public class MainActivity : AvaloniaMainActivity +{ + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont() + .UseReactiveUI(); + } +} + +/*using Android.App; +using Android.Content; +using Android.Content.PM; +using Android.Runtime; +using Avalonia; +using Avalonia.Android; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.ReactiveUI; +using HitCounterManager.Views; +using System.ComponentModel; + +namespace HitCounterManager.Android +{ + [Activity( + Label = "HitCounterManager.Android", + Theme = "@style/MyTheme.NoActionBar", + Icon = "@drawable/icon", + MainLauncher = true, + ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] + public class MainActivity : AvaloniaMainActivity + { + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont() + .UseReactiveUI(); + } + + public override void OnBackPressed() + { + if (App.CurrentApp.ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) + { + // Return to previous page + SingleViewNavigationPage RootPage = (SingleViewNavigationPage)singleViewPlatform.MainView!; + if (1 < RootPage.NavStack.Count) + { + RootPage.PopPage(); + return; + } + + // Idea of stopping the process by defualt but this will popup the message box + // every time one is about the hit back button. Therefore it is better to keep + // the application running in backgroung. + // We will save the current state during OnStop(). +#if EXAMPLE_FORCED_SHUTDOWN + RootPage.MainPage.OnClosing(this, new CancelEventArgs()); + App.CurrentApp.AppExitHandler(this, null); + Finish(); +#endif + } + + base.OnBackPressed(); + } + + protected override void OnStop() + { + App.CurrentApp.SaveSettings(); + base.OnStop(); + } + + protected override void OnDestroy() + { + App.CurrentApp.AppExitHandler(this, new()); + base.OnDestroy(); + } + } +} +*/ \ No newline at end of file diff --git a/Source/HitCounterManager.Android/Properties/AndroidManifest.xml b/Source/HitCounterManager.Android/Properties/AndroidManifest.xml new file mode 100644 index 00000000..f6717fa2 --- /dev/null +++ b/Source/HitCounterManager.Android/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/Source/HitCounterManager.Android/Resources/AboutResources.txt b/Source/HitCounterManager.Android/Resources/AboutResources.txt new file mode 100644 index 00000000..4cededee --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/Source/HitCounterManager.Android/Resources/drawable-night-v31/avalonia_anim.xml b/Source/HitCounterManager.Android/Resources/drawable-night-v31/avalonia_anim.xml new file mode 100644 index 00000000..1fef3acf --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/drawable-night-v31/avalonia_anim.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/HitCounterManager.Android/Resources/drawable-v31/avalonia_anim.xml b/Source/HitCounterManager.Android/Resources/drawable-v31/avalonia_anim.xml new file mode 100644 index 00000000..4784f80d --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/drawable-v31/avalonia_anim.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/HitCounterManager.Android/Resources/drawable/splash_screen.xml b/Source/HitCounterManager.Android/Resources/drawable/splash_screen.xml new file mode 100644 index 00000000..4cebfe2c --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/drawable/splash_screen.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/Source/HitCounterManager.Android/Resources/values-night/colors.xml b/Source/HitCounterManager.Android/Resources/values-night/colors.xml new file mode 100644 index 00000000..0f6f6c8c --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #212121 + diff --git a/Source/HitCounterManager.Android/Resources/values-v31/styles.xml b/Source/HitCounterManager.Android/Resources/values-v31/styles.xml new file mode 100644 index 00000000..8075ffad --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/Source/HitCounterManager.Android/Resources/values/colors.xml b/Source/HitCounterManager.Android/Resources/values/colors.xml new file mode 100644 index 00000000..6fbae256 --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/values/colors.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + diff --git a/Source/HitCounterManager.Android/Resources/values/styles.xml b/Source/HitCounterManager.Android/Resources/values/styles.xml new file mode 100644 index 00000000..77ed2d72 --- /dev/null +++ b/Source/HitCounterManager.Android/Resources/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/Source/HitCounterManager.Desktop/HitCounterManager.Desktop.csproj b/Source/HitCounterManager.Desktop/HitCounterManager.Desktop.csproj new file mode 100644 index 00000000..cde16da5 --- /dev/null +++ b/Source/HitCounterManager.Desktop/HitCounterManager.Desktop.csproj @@ -0,0 +1,21 @@ + + + + net7.0 + + + WinExe + $(Product).Desktop + + win;linux;osx + true + ../$(Product)/Resources/FireIcon.ico + + + + + + + + + diff --git a/Source/HitCounterManager/Common/Program.cs b/Source/HitCounterManager.Desktop/Program.cs similarity index 92% rename from Source/HitCounterManager/Common/Program.cs rename to Source/HitCounterManager.Desktop/Program.cs index babdf389..c95a29a3 100644 --- a/Source/HitCounterManager/Common/Program.cs +++ b/Source/HitCounterManager.Desktop/Program.cs @@ -1,45 +1,46 @@ -//MIT License - -//Copyright (c) 2022-2022 Peter Kirmeier - -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: - -//The above copyright notice and this permission notice shall be included in all -//copies or substantial portions of the Software. - -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -//SOFTWARE. - -using Avalonia; -using Avalonia.ReactiveUI; -using System; - -namespace HitCounterManager -{ - class Program - { - // Initialization code. Don't use any Avalonia, third-party APIs or any - // SynchronizationContext-reliant code before AppMain is called: things aren't initialized - // yet and stuff might break. - [STAThread] - public static void Main(string[] args) => BuildAvaloniaApp() - .StartWithClassicDesktopLifetime(args); - - // Avalonia configuration, don't remove; also used by visual designer. - public static AppBuilder BuildAvaloniaApp() - => AppBuilder.Configure() - .UsePlatformDetect() - .LogToTrace() - .UseReactiveUI(); - } -} +//MIT License + +//Copyright (c) 2022-2023 Peter Kirmeier + +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files (the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions: + +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. + +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +using Avalonia; +using Avalonia.ReactiveUI; +using System; + +namespace HitCounterManager.Desktop +{ + class Program + { + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace() + .UseReactiveUI(); + } +} diff --git a/Source/HitCounterManager.sln b/Source/HitCounterManager.sln index 40bb688f..8aace530 100644 --- a/Source/HitCounterManager.sln +++ b/Source/HitCounterManager.sln @@ -3,7 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31611.283 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HitCounterManager", "HitCounterManager\HitCounterManager.csproj", "{BCD87D6B-3F73-46BA-B87E-0977A3D1CAD4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HitCounterManager", "HitCounterManager\HitCounterManager.PCL.csproj", "{BCD87D6B-3F73-46BA-B87E-0977A3D1CAD4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HitCounterManager.Desktop", "HitCounterManager.Desktop\HitCounterManager.Desktop.csproj", "{D69295AA-7BD6-46EC-8482-FB089246B91E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HitCounterManager.Android", "HitCounterManager.Android\HitCounterManager.Android.csproj", "{044A623F-CE8A-4694-A999-F80F02C09666}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -17,6 +21,16 @@ Global {BCD87D6B-3F73-46BA-B87E-0977A3D1CAD4}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCD87D6B-3F73-46BA-B87E-0977A3D1CAD4}.Release|Any CPU.Build.0 = Release|Any CPU {BCD87D6B-3F73-46BA-B87E-0977A3D1CAD4}.Release|Any CPU.Deploy.0 = Release|Any CPU + {D69295AA-7BD6-46EC-8482-FB089246B91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D69295AA-7BD6-46EC-8482-FB089246B91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D69295AA-7BD6-46EC-8482-FB089246B91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D69295AA-7BD6-46EC-8482-FB089246B91E}.Release|Any CPU.Build.0 = Release|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Debug|Any CPU.Build.0 = Debug|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Release|Any CPU.ActiveCfg = Release|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Release|Any CPU.Build.0 = Release|Any CPU + {044A623F-CE8A-4694-A999-F80F02C09666}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Source/HitCounterManager/Common/App.axaml b/Source/HitCounterManager/Common/App.axaml index 31da015e..4a032dd7 100644 --- a/Source/HitCounterManager/Common/App.axaml +++ b/Source/HitCounterManager/Common/App.axaml @@ -24,8 +24,7 @@ --> @@ -69,112 +68,112 @@ Beige - - /Resources/Images/icons8-trash-20.png - - - /Resources/Images/icons8-search-in-browser-20.png - - - /Resources/Images/icons8-information-18.png - + + /Resources/drawable/icons8_trash_20.png + + + /Resources/drawable/icons8_search_in_browser_20.png + + + /Resources/drawable/icons8_information_18.png + - - /Resources/Images/icons8-inactive-state-20.png - - - /Resources/Images/icons8-circled-right-20.png - - - /Resources/Images/icons8-last-24-hours-20.png - - - /Resources/Images/icons8-empty-flag-20.png - - - /Resources/Images/icons8-flag-filled-20.png - + + /Resources/drawable/icons8_inactive_state_20.png + + + /Resources/drawable/icons8_circled_right_20.png + + + /Resources/drawable/icons8_last_24_hours_20.png + + + /Resources/drawable/icons8_empty_flag_20.png + + + /Resources/drawable/icons8_flag_filled_20.png + - - /Resources/Images/icons8-settings-20.png - - - /Resources/Images/icons8-save-20.png - - - /Resources/Images/icons8-website-20.png - - - /Resources/Images/20p_logo_black.png - - - /Resources/Images/icons8-cloud-20.png - - - /Resources/Images/icons8-about-20.png - + + /Resources/drawable/icons8_settings_20.png + + + /Resources/drawable/icons8_save_20.png + + + /Resources/drawable/icons8_website_20.png + + + /Resources/drawable/team_hitless_20p_logo_black.png + + + /Resources/drawable/icons8_cloud_20.png + + + /Resources/drawable/icons8_about_20.png + - - /Resources/Images/icons8-add-20.png - - - /Resources/Images/icons8-edit-20.png - - - /Resources/Images/icons8-copy-20.png - + + /Resources/drawable/icons8_add_20.png + + + /Resources/drawable/icons8_edit_20.png + + + /Resources/drawable/icons8_copy_20.png + - - /Resources/Images/icons8-counter-20.png - - - /Resources/Images/icons8-scroll-up-20.png - - - /Resources/Images/icons8-scroll-down-20.png - - - /Resources/Images/icons8-add-list-20.png - + + /Resources/drawable/icons8_counter_20.png + + + /Resources/drawable/icons8_scroll_up_20.png + + + /Resources/drawable/icons8_scroll_down_20.png + + + /Resources/drawable/icons8_add_list_20.png + - - /Resources/Images/icons8-lock-20.png - - - /Resources/Images/icons8-padlock-20.png - - - /Resources/Images/icons8-pin-20.png - - - /Resources/Images/icons8-flash-light-20.png - + + /Resources/drawable/icons8_lock_20.png + + + /Resources/drawable/icons8_padlock_20.png + + + /Resources/drawable/icons8_pin_20.png + + + /Resources/drawable/icons8_flash_light_20.png + - - /Resources/Images/icons8-repeat-one-32.png - - - /Resources/Images/icons8-trophy-32.png - - - /Resources/Images/icons8-sleep-32.png - - - /Resources/Images/icons8-time-32.png - - - /Resources/Images/icons8-attack-32.png - - - /Resources/Images/icons8-watch-your-step-32.png - - - /Resources/Images/icons8-staircase-32.png - + + /Resources/drawable/icons8_repeat_one_32.png + + + /Resources/drawable/icons8_trophy_32.png + + + /Resources/drawable/icons8_sleep_32.png + + + /Resources/drawable/icons8_time_32.png + + + /Resources/drawable/icons8_attack_32.png + + + /Resources/drawable/icons8_watch_your_step_32.png + + + /Resources/drawable/icons8_staircase_32.png + - + @@ -197,7 +196,7 @@ - +