diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..2370c02
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,201 @@
+# Remove the line below if you want to inherit .editorconfig settings from higher directories
+root = true
+
+# C# files
+[*.cs]
+
+#### Core EditorConfig Options ####
+
+# Indentation and spacing
+indent_size = 4
+indent_style = space
+tab_width = 4
+
+# New line preferences
+end_of_line = crlf
+insert_final_newline = true
+
+#### .NET Coding Conventions ####
+
+# Organize usings
+dotnet_separate_import_directive_groups = false
+dotnet_sort_system_directives_first = true
+file_header_template = unset
+
+# this. and Me. preferences
+dotnet_style_qualification_for_event = true:silent
+dotnet_style_qualification_for_field = true:silent
+dotnet_style_qualification_for_method = true:silent
+dotnet_style_qualification_for_property = true:silent
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent
+dotnet_style_predefined_type_for_member_access = true:silent
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
+
+# Expression-level preferences
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+
+# Field preferences
+dotnet_style_readonly_field = true:suggestion
+
+# Parameter preferences
+dotnet_code_quality_unused_parameters = all:suggestion
+
+#### C# Coding Conventions ####
+
+# var preferences
+csharp_style_var_elsewhere = true:silent
+csharp_style_var_for_built_in_types = true:silent
+csharp_style_var_when_type_is_apparent = true:silent
+
+# Expression-bodied members
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+
+# Pattern matching preferences
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_switch_expression = true:suggestion
+
+# Null-checking preferences
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_prefer_static_local_function = true:suggestion
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent
+
+# Code-block preferences
+csharp_prefer_braces = true:silent
+csharp_prefer_simple_using_statement = true:suggestion
+
+# Expression-level preferences
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
+
+# 'using' directive preferences
+csharp_using_directive_placement = inside_namespace:silent
+
+#### C# Formatting Rules ####
+
+# New line preferences
+csharp_new_line_before_catch = true
+csharp_new_line_before_else = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# Naming styles
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
diff --git a/.gitignore b/.gitignore
index 4ce6fdd..f92544f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -337,4 +337,7 @@ ASALocalRun/
.localhistory/
# BeatPulse healthcheck temp database
-healthchecksdb
\ No newline at end of file
+healthchecksdb
+
+# End template ignores
+*.[Dd]esigner.cs
diff --git a/ActivityJournal.sln b/ActivityJournal.sln
new file mode 100644
index 0000000..441034c
--- /dev/null
+++ b/ActivityJournal.sln
@@ -0,0 +1,74 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30204.135
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SdgApps.TimeWise.ActivityJournal", "SdgApps.TimeWise.ActivityJournal\SdgApps.TimeWise.ActivityJournal.csproj", "{466D6056-F740-4353-B878-7DFFA6768E98}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SdgApps.TimeWise.ActivityJournal.Droid", "SdgApps.TimeWise.ActivityJournal.Droid\SdgApps.TimeWise.ActivityJournal.Droid.csproj", "{57566DDD-F154-4121-9855-FC9E566366D6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SdgApps.TimeWise.ActivityJournal.Ios", "SdgApps.TimeWise.ActivityJournal.Ios\SdgApps.TimeWise.ActivityJournal.Ios.csproj", "{DB098078-5F20-4B29-883B-258875F87DC3}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{73F86316-E2C8-4ED2-BEC4-50646B3EAE8F}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|Any CPU = Release|Any CPU
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|Any CPU.Build.0 = Release|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|iPhone.Build.0 = Release|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {466D6056-F740-4353-B878-7DFFA6768E98}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhone.Build.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Debug|iPhone.Build.0 = Debug|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Release|iPhone.ActiveCfg = Release|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Release|iPhone.Build.0 = Release|iPhone
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {DB098078-5F20-4B29-883B-258875F87DC3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B2CEADEB-A4B4-472A-A06D-4B4DA4418DDF}
+ EndGlobalSection
+EndGlobal
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Assets/AboutAssets.txt b/SdgApps.TimeWise.ActivityJournal.Droid/Assets/AboutAssets.txt
new file mode 100644
index 0000000..072563f
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/MainActivity.cs b/SdgApps.TimeWise.ActivityJournal.Droid/MainActivity.cs
new file mode 100644
index 0000000..3c44ab1
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/MainActivity.cs
@@ -0,0 +1,40 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Droid
+{
+ using Android.App;
+ using Android.Content.PM;
+ using Android.OS;
+ using Android.Runtime;
+
+ ///
+ /// Main Android activity in which the application runs.
+ ///
+ [Activity(Label = "SdgApps.TimeWise.ActivityJournal", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ ///
+ public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
+ {
+ Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+
+ base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+
+ ///
+ protected override void OnCreate(Bundle savedInstanceState)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate(savedInstanceState);
+
+ Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
+ Xamarin.Essentials.Platform.Init(this, savedInstanceState);
+ Xamarin.Forms.Forms.Init(this, savedInstanceState);
+ this.LoadApplication(new App());
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AndroidManifest.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AndroidManifest.xml
new file mode 100644
index 0000000..8b4d6a7
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AssemblyInfo.cs b/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e22fc15
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+using Android.App;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SdgApps.TimeWise.ActivityJournal.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SdgApps.TimeWise.ActivityJournal.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+// Add some common permissions, these can be removed if not needed
+[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
+[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/AboutResources.txt b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/AboutResources.txt
new file mode 100644
index 0000000..cb30f20
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+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.xml),
+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-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ 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
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ 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 Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_about.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_about.png
new file mode 100644
index 0000000..4884525
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_about.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_feed.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_feed.png
new file mode 100644
index 0000000..fdf6daf
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/tab_feed.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/xamarin_logo.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/xamarin_logo.png
new file mode 100644
index 0000000..b36d00e
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/drawable/xamarin_logo.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Tabbar.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Tabbar.xml
new file mode 100644
index 0000000..ad1f87d
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Tabbar.xml
@@ -0,0 +1,11 @@
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Toolbar.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Toolbar.xml
new file mode 100644
index 0000000..aabd0a3
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/layout/Toolbar.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon.xml
new file mode 100644
index 0000000..88d1d0a
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon_round.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon_round.xml
new file mode 100644
index 0000000..88d1d0a
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-anydpi-v26/icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/icon.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/icon.png
new file mode 100644
index 0000000..4623ca2
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/icon.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/launcher_foreground.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/launcher_foreground.png
new file mode 100644
index 0000000..a89e5bb
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-hdpi/launcher_foreground.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/icon.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/icon.png
new file mode 100644
index 0000000..9b1d25e
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/icon.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/launcher_foreground.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/launcher_foreground.png
new file mode 100644
index 0000000..431a8a0
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-mdpi/launcher_foreground.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/icon.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/icon.png
new file mode 100644
index 0000000..844dfe5
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/icon.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/launcher_foreground.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/launcher_foreground.png
new file mode 100644
index 0000000..9e9e4f8
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xhdpi/launcher_foreground.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/icon.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/icon.png
new file mode 100644
index 0000000..e20ec9a
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/icon.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/launcher_foreground.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/launcher_foreground.png
new file mode 100644
index 0000000..5f1e135
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxhdpi/launcher_foreground.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/icon.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/icon.png
new file mode 100644
index 0000000..8a08bf7
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/icon.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/launcher_foreground.png b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/launcher_foreground.png
new file mode 100644
index 0000000..aca9f8d
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/mipmap-xxxhdpi/launcher_foreground.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/colors.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/colors.xml
new file mode 100644
index 0000000..d9f6e0b
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #FFFFFF
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/styles.xml b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/styles.xml
new file mode 100644
index 0000000..17a2eb0
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/Resources/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/SdgApps.TimeWise.ActivityJournal.Droid.csproj b/SdgApps.TimeWise.ActivityJournal.Droid/SdgApps.TimeWise.ActivityJournal.Droid.csproj
new file mode 100644
index 0000000..4d63731
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/SdgApps.TimeWise.ActivityJournal.Droid.csproj
@@ -0,0 +1,106 @@
+
+
+
+ Debug
+ AnyCPU
+ {57566DDD-F154-4121-9855-FC9E566366D6}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {6968b3a4-1835-46a3-ac5c-1ae33b475983}
+ Library
+ SdgApps.TimeWise.ActivityJournal.Droid
+ SdgApps.TimeWise.ActivityJournal.Droid
+ True
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Properties\AndroidManifest.xml
+ Resources
+ Assets
+ false
+ v9.0
+ true
+ true
+ Xamarin.Android.Net.AndroidClientHandler
+
+
+
+
+ true
+ portable
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ bin\Debug\SdgApps.TimeWise.ActivityJournal.Android.xml
+
+
+ true
+ portable
+ true
+ bin\Release
+ prompt
+ 4
+ true
+ false
+ bin\Release\SdgApps.TimeWise.ActivityJournal.Android.xml
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.1.118
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {00DC8A37-1DF2-461B-AA56-539D0D1563F7}
+ SdgApps.TimeWise.ActivityJournal
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal.Droid/stylecop.json b/SdgApps.TimeWise.ActivityJournal.Droid/stylecop.json
new file mode 100644
index 0000000..d6b3d43
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Droid/stylecop.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
+ "settings": {
+ "documentationRules": {
+ "companyName": "Soli Deo Gloria Apps"
+ },
+ "layoutRules": {
+ "newlineAtEndOfFile": "require"
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/AppDelegate.cs b/SdgApps.TimeWise.ActivityJournal.Ios/AppDelegate.cs
new file mode 100644
index 0000000..8b6ac3a
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/AppDelegate.cs
@@ -0,0 +1,35 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Ios
+{
+ using Foundation;
+ using UIKit;
+
+ ///
+ /// The UIApplicationDelegate for the application. This class is responsible for launching the
+ /// User Interface of the application, as well as listening (and optionally responding) to
+ /// application events from iOS.
+ ///
+ [Register("AppDelegate")]
+ public partial class AppDelegate : Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ ///
+ ///
+ /// This method is invoked when the application has loaded and is ready to run. In this
+ /// method you should instantiate the window, load the UI into it and then make the window
+ /// visible.
+ ///
+ /// You have 17 seconds to return from this method, or iOS will terminate your application.
+ ///
+ public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
+ {
+ Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
+ Xamarin.Forms.Forms.Init();
+ this.LoadApplication(new App());
+
+ return base.FinishedLaunching(uiApplication, launchOptions);
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Application.cs b/SdgApps.TimeWise.ActivityJournal.Ios/Application.cs
new file mode 100644
index 0000000..430dec0
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Application.cs
@@ -0,0 +1,22 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Ios
+{
+ using UIKit;
+
+ ///
+ /// Main iOS application class.
+ ///
+ public static class Application
+ {
+ // This is the main entry point of the application.
+ private static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..98f4d03
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,117 @@
+{
+ "images": [
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "3x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon60.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "3x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon87.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "3x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "2x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "3x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon180.png"
+ },
+ {
+ "scale": "1x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon20.png"
+ },
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "1x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon29.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "1x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "1x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon76.png"
+ },
+ {
+ "scale": "2x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon152.png"
+ },
+ {
+ "scale": "2x",
+ "size": "83.5x83.5",
+ "idiom": "ipad",
+ "filename": "Icon167.png"
+ },
+ {
+ "scale": "1x",
+ "size": "1024x1024",
+ "idiom": "ios-marketing",
+ "filename": "Icon1024.png"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon1024.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon1024.png
new file mode 100644
index 0000000..9174c98
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon1024.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon120.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon120.png
new file mode 100644
index 0000000..9c60a17
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon120.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon152.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon152.png
new file mode 100644
index 0000000..448d6ef
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon152.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon167.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon167.png
new file mode 100644
index 0000000..8524768
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon167.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon180.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon180.png
new file mode 100644
index 0000000..60a6470
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon180.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon20.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon20.png
new file mode 100644
index 0000000..45268a6
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon20.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon29.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon29.png
new file mode 100644
index 0000000..6a6c77a
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon29.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon40.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon40.png
new file mode 100644
index 0000000..cc7edcf
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon40.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon58.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon58.png
new file mode 100644
index 0000000..1ad04f0
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon58.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon60.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon60.png
new file mode 100644
index 0000000..2dd5262
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon60.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon76.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon76.png
new file mode 100644
index 0000000..b058cae
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon76.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon80.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon80.png
new file mode 100644
index 0000000..02e47a2
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon80.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon87.png b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon87.png
new file mode 100644
index 0000000..4954a4b
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Assets.xcassets/AppIcon.appiconset/Icon87.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Entitlements.plist b/SdgApps.TimeWise.ActivityJournal.Ios/Entitlements.plist
new file mode 100644
index 0000000..e9a3005
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Info.plist b/SdgApps.TimeWise.ActivityJournal.Ios/Info.plist
new file mode 100644
index 0000000..08fba3f
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ SdgApps.TimeWise.ActivityJournal
+ CFBundleIdentifier
+ com.companyname.SdgApps.TimeWise.ActivityJournal
+ CFBundleVersion
+ 1.0
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleName
+ SdgApps.TimeWise.ActivityJournal
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Properties/AssemblyInfo.cs b/SdgApps.TimeWise.ActivityJournal.Ios/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e1fc774
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Properties/AssemblyInfo.cs
@@ -0,0 +1,39 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SdgApps.TimeWise.ActivityJournal.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SdgApps.TimeWise.ActivityJournal.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-568h@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-568h@2x.png
new file mode 100644
index 0000000..26c6461
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-568h@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait.png
new file mode 100644
index 0000000..5d0d1ab
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait@2x.png
new file mode 100644
index 0000000..0ee2688
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default-Portrait@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default.png
new file mode 100644
index 0000000..b74643c
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default@2x.png
new file mode 100644
index 0000000..dbd6bd3
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/Default@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/LaunchScreen.storyboard b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/LaunchScreen.storyboard
new file mode 100644
index 0000000..a639c2f
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about.png
new file mode 100644
index 0000000..4884525
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@2x.png
new file mode 100644
index 0000000..f9ba9f9
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@3x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@3x.png
new file mode 100644
index 0000000..fa470c2
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_about@3x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed.png
new file mode 100644
index 0000000..fdf6daf
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@2x.png
new file mode 100644
index 0000000..845d96c
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@3x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@3x.png
new file mode 100644
index 0000000..812cf73
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/tab_feed@3x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo.png
new file mode 100644
index 0000000..7d5007d
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@2x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@2x.png
new file mode 100644
index 0000000..a5b9fc0
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@2x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@3x.png b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@3x.png
new file mode 100644
index 0000000..b36d00e
Binary files /dev/null and b/SdgApps.TimeWise.ActivityJournal.Ios/Resources/xamarin_logo@3x.png differ
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/SdgApps.TimeWise.ActivityJournal.Ios.csproj b/SdgApps.TimeWise.ActivityJournal.Ios/SdgApps.TimeWise.ActivityJournal.Ios.csproj
new file mode 100644
index 0000000..058e02a
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/SdgApps.TimeWise.ActivityJournal.Ios.csproj
@@ -0,0 +1,153 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {DB098078-5F20-4B29-883B-258875F87DC3}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {89a4fe7c-635d-49c9-8d8c-5cd363c0d68d}
+ Exe
+ SdgApps.TimeWise.ActivityJournal.Ios
+ Resources
+ SdgApps.TimeWise.ActivityJournal.Ios
+ true
+ NSUrlSessionHandler
+ automatic
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ x86_64
+ None
+ true
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ None
+ -all
+ bin\iPhone\Debug\SdgApps.TimeWise.ActivityJournal.Ios.xml
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ Entitlements.plist
+ bin\iPhone\Release\SdgApps.TimeWise.ActivityJournal.Ios.xml
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.1.118
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+ {00DC8A37-1DF2-461B-AA56-539D0D1563F7}
+ SdgApps.TimeWise.ActivityJournal
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal.Ios/stylecop.json b/SdgApps.TimeWise.ActivityJournal.Ios/stylecop.json
new file mode 100644
index 0000000..d6b3d43
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal.Ios/stylecop.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
+ "settings": {
+ "documentationRules": {
+ "companyName": "Soli Deo Gloria Apps"
+ },
+ "layoutRules": {
+ "newlineAtEndOfFile": "require"
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/App.xaml b/SdgApps.TimeWise.ActivityJournal/App.xaml
new file mode 100644
index 0000000..7e46326
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/App.xaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal/App.xaml.cs b/SdgApps.TimeWise.ActivityJournal/App.xaml.cs
new file mode 100644
index 0000000..1163144
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/App.xaml.cs
@@ -0,0 +1,26 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal
+{
+ using SdgApps.TimeWise.ActivityJournal.Services;
+ using Xamarin.Forms;
+
+ ///
+ /// Top-level cross-platform application class.
+ ///
+ public partial class App : Application
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+
+ DependencyService.Register();
+ this.MainPage = new AppShell();
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/AppShell.xaml b/SdgApps.TimeWise.ActivityJournal/AppShell.xaml
new file mode 100644
index 0000000..230a2ff
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/AppShell.xaml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+ #2196F3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal/AppShell.xaml.cs b/SdgApps.TimeWise.ActivityJournal/AppShell.xaml.cs
new file mode 100644
index 0000000..5e93130
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/AppShell.xaml.cs
@@ -0,0 +1,20 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal
+{
+ ///
+ /// Main application UI shell.
+ ///
+ public partial class AppShell : Xamarin.Forms.Shell
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public AppShell()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/AssemblyInfo.cs b/SdgApps.TimeWise.ActivityJournal/AssemblyInfo.cs
new file mode 100644
index 0000000..4fad586
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/AssemblyInfo.cs
@@ -0,0 +1,7 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+using Xamarin.Forms.Xaml;
+
+[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
diff --git a/SdgApps.TimeWise.ActivityJournal/Models/Activity.cs b/SdgApps.TimeWise.ActivityJournal/Models/Activity.cs
new file mode 100644
index 0000000..d395a2c
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Models/Activity.cs
@@ -0,0 +1,44 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Models
+{
+ using System;
+
+ ///
+ /// Activity model.
+ ///
+ public class Activity
+ {
+ ///
+ /// Gets or sets ID.
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// Gets or sets brief text.
+ ///
+ public string Title { get; set; }
+
+ ///
+ /// Gets or sets the time the activity started.
+ ///
+ public DateTime Start { get; set; }
+
+ ///
+ /// Gets or sets the time the activity ended.
+ ///
+ public DateTime End { get; set; }
+
+ ///
+ /// Gets or sets detailed description.
+ ///
+ public string Description { get; set; }
+
+ ///
+ /// Gets or sets the general activity category.
+ ///
+ public string Category { get; set; }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/SdgApps.TimeWise.ActivityJournal.csproj b/SdgApps.TimeWise.ActivityJournal/SdgApps.TimeWise.ActivityJournal.csproj
new file mode 100644
index 0000000..abdeaf4
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/SdgApps.TimeWise.ActivityJournal.csproj
@@ -0,0 +1,44 @@
+
+
+
+ netstandard2.0
+ true
+
+
+
+ bin\Debug\netstandard2.0\SdgApps.TimeWise.ActivityJournal.xml
+
+
+
+ bin\Release\netstandard2.0\SdgApps.TimeWise.ActivityJournal.xml
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+ ActivitiesPage.xaml
+
+
+ ActivityDetailPage.xaml
+
+
+ NewActivityPage.xaml
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal/Services/IDataStore.cs b/SdgApps.TimeWise.ActivityJournal/Services/IDataStore.cs
new file mode 100644
index 0000000..abe8fb3
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Services/IDataStore.cs
@@ -0,0 +1,51 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Services
+{
+ using System.Collections.Generic;
+ using System.Threading.Tasks;
+
+ ///
+ /// Generic data store interface.
+ ///
+ /// Type of data to store.
+ public interface IDataStore
+ {
+ ///
+ /// Adds item to data store.
+ ///
+ /// Item to add.
+ /// A representing the result of the asynchronous operation.
+ Task AddItemAsync(T item);
+
+ ///
+ /// Updates item in data store.
+ ///
+ /// Item to update.
+ /// A representing the result of the asynchronous operation.
+ Task UpdateItemAsync(T item);
+
+ ///
+ /// Deletes item from data store.
+ ///
+ /// ID of item to delete.
+ /// A representing the result of the asynchronous operation.
+ Task DeleteItemAsync(string id);
+
+ ///
+ /// Gets item from data store.
+ ///
+ /// ID of item to get.
+ /// A representing the result of the asynchronous operation.
+ Task GetItemAsync(string id);
+
+ ///
+ /// Gets all items from data store.
+ ///
+ /// True if cache should be ignored.
+ /// A representing the result of the asynchronous operation.
+ Task> GetItemsAsync(bool forceRefresh = false);
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/Services/MockDataStore.cs b/SdgApps.TimeWise.ActivityJournal/Services/MockDataStore.cs
new file mode 100644
index 0000000..9947051
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Services/MockDataStore.cs
@@ -0,0 +1,123 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Services
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Threading.Tasks;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+
+ ///
+ /// Mock data store implementation.
+ ///
+ public class MockDataStore : IDataStore
+ {
+ private readonly List activities;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public MockDataStore()
+ {
+ this.activities = new List()
+ {
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "First activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "Second activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "Third activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "Fourth activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "Fifth activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ new Activity
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = "Sixth activity",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ },
+ };
+ }
+
+ ///
+ public Task AddItemAsync(Activity item)
+ {
+ this.activities.Add(item);
+
+ return Task.FromResult(true);
+ }
+
+ ///
+ public Task UpdateItemAsync(Activity item)
+ {
+ var oldActivity = this.activities.FirstOrDefault((a) => a.Id == item.Id);
+ this.activities.Remove(oldActivity);
+ this.activities.Add(item);
+
+ return Task.FromResult(true);
+ }
+
+ ///
+ public Task DeleteItemAsync(string id)
+ {
+ var oldActivity = this.activities.FirstOrDefault((Activity arg) => arg.Id == id);
+ this.activities.Remove(oldActivity);
+
+ return Task.FromResult(true);
+ }
+
+ ///
+ public Task GetItemAsync(string id)
+ {
+ return Task.FromResult(this.activities.FirstOrDefault(s => s.Id == id));
+ }
+
+ ///
+ public Task> GetItemsAsync(bool forceRefresh = false)
+ {
+ return Task.FromResult>(this.activities);
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/ViewModels/AboutViewModel.cs b/SdgApps.TimeWise.ActivityJournal/ViewModels/AboutViewModel.cs
new file mode 100644
index 0000000..175769a
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/ViewModels/AboutViewModel.cs
@@ -0,0 +1,20 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.ViewModels
+{
+ ///
+ /// View model for the About screen.
+ ///
+ public class AboutViewModel : BaseViewModel
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public AboutViewModel()
+ {
+ this.Title = "About";
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivitiesViewModel.cs b/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivitiesViewModel.cs
new file mode 100644
index 0000000..a7614db
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivitiesViewModel.cs
@@ -0,0 +1,70 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.ViewModels
+{
+ using System;
+ using System.Collections.ObjectModel;
+ using System.Diagnostics;
+ using System.Threading.Tasks;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+ using SdgApps.TimeWise.ActivityJournal.Views;
+ using Xamarin.Forms;
+
+ ///
+ /// View model for the activities list screen.
+ ///
+ public class ActivitiesViewModel : BaseViewModel
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ActivitiesViewModel()
+ {
+ this.Title = "Browse";
+ this.Activities = new ObservableCollection();
+ this.LoadActivitiesCommand = new Command(async () => await this.ExecuteLoadActivitiesCommand());
+
+ MessagingCenter.Subscribe(this, "AddActivity", async (obj, act) =>
+ {
+ var newActivity = act;
+ this.Activities.Add(newActivity);
+ await this.DataStore.AddItemAsync(newActivity);
+ });
+ }
+
+ ///
+ /// Gets or sets activities list to view.
+ ///
+ public ObservableCollection Activities { get; set; }
+
+ ///
+ /// Gets or sets command to load activities list.
+ ///
+ public Command LoadActivitiesCommand { get; set; }
+
+ private async Task ExecuteLoadActivitiesCommand()
+ {
+ this.IsBusy = true;
+
+ try
+ {
+ this.Activities.Clear();
+ var activities = await this.DataStore.GetItemsAsync(true);
+ foreach (var activity in activities)
+ {
+ this.Activities.Add(activity);
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex);
+ }
+ finally
+ {
+ this.IsBusy = false;
+ }
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivityDetailViewModel.cs b/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivityDetailViewModel.cs
new file mode 100644
index 0000000..ded85fd
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/ViewModels/ActivityDetailViewModel.cs
@@ -0,0 +1,29 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.ViewModels
+{
+ using SdgApps.TimeWise.ActivityJournal.Models;
+
+ ///
+ /// View model for the Activity Detail screen.
+ ///
+ public class ActivityDetailViewModel : BaseViewModel
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Activity whose details to view.
+ public ActivityDetailViewModel(Activity activity = null)
+ {
+ this.Title = activity?.Title;
+ this.Activity = activity;
+ }
+
+ ///
+ /// Gets or sets viewed activity.
+ ///
+ public Activity Activity { get; set; }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/ViewModels/BaseViewModel.cs b/SdgApps.TimeWise.ActivityJournal/ViewModels/BaseViewModel.cs
new file mode 100644
index 0000000..d5e3b5d
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/ViewModels/BaseViewModel.cs
@@ -0,0 +1,86 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.ViewModels
+{
+ using System;
+ using System.Collections.Generic;
+ using System.ComponentModel;
+ using System.Runtime.CompilerServices;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+ using SdgApps.TimeWise.ActivityJournal.Services;
+ using Xamarin.Forms;
+
+ ///
+ /// Base view model class.
+ ///
+ public class BaseViewModel : INotifyPropertyChanged
+ {
+ private bool isBusy = false;
+ private string title = string.Empty;
+
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// Gets the activities data store.
+ ///
+ public IDataStore DataStore => DependencyService.Get>();
+
+ ///
+ /// Gets or sets a value indicating whether the view is busy.
+ ///
+ public bool IsBusy
+ {
+ get { return this.isBusy; }
+ set { this.SetProperty(ref this.isBusy, value); }
+ }
+
+ ///
+ /// Gets or sets view title.
+ ///
+ public string Title
+ {
+ get { return this.title; }
+ set { this.SetProperty(ref this.title, value); }
+ }
+
+ ///
+ /// Sets a property and invokes event on view if data changed.
+ ///
+ /// Type of property.
+ /// Original property data.
+ /// New property data.
+ /// Additional, optional callback to execute if data changed.
+ /// Name of property whose data to set.
+ /// True if property changed sucessfully.
+ protected bool SetProperty(
+ ref T backingStore,
+ T value,
+ Action onChanged = null,
+ [CallerMemberName] string propertyName = "")
+ {
+ var retVal = false;
+
+ if (!EqualityComparer.Default.Equals(backingStore, value))
+ {
+ backingStore = value;
+ onChanged?.Invoke();
+ this.OnPropertyChanged(propertyName);
+ retVal = true;
+ }
+
+ return retVal;
+ }
+
+ ///
+ /// Invokes the event.
+ ///
+ /// Name of changed property.
+ protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
+ {
+ this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/ViewModels/NewActivityViewModel.cs b/SdgApps.TimeWise.ActivityJournal/ViewModels/NewActivityViewModel.cs
new file mode 100644
index 0000000..4df0ec5
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/ViewModels/NewActivityViewModel.cs
@@ -0,0 +1,85 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.ViewModels
+{
+ using System;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+
+ ///
+ /// View model for the Activity Detail screen.
+ ///
+ public class NewActivityViewModel : BaseViewModel
+ {
+ private DateTime startDate;
+ private TimeSpan startTime;
+ private DateTime endDate;
+ private TimeSpan endTime;
+ private string description;
+ private string category;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Activity whose details to view.
+ public NewActivityViewModel(Activity activity = null)
+ {
+ this.Title = activity?.Title;
+ }
+
+ ///
+ /// Gets or sets the date the activity started.
+ ///
+ public DateTime StartDate
+ {
+ get => this.startDate;
+ set => this.SetProperty(ref this.startDate, value);
+ }
+
+ ///
+ /// Gets or sets the time the activity started.
+ ///
+ public TimeSpan StartTime
+ {
+ get => this.startTime;
+ set => this.SetProperty(ref this.startTime, value);
+ }
+
+ ///
+ /// Gets or sets the date the activity ended.
+ ///
+ public DateTime EndDate
+ {
+ get => this.endDate;
+ set => this.SetProperty(ref this.endDate, value);
+ }
+
+ ///
+ /// Gets or sets the time the activity ended.
+ ///
+ public TimeSpan EndTime
+ {
+ get => this.endTime;
+ set => this.SetProperty(ref this.endTime, value);
+ }
+
+ ///
+ /// Gets or sets detailed description.
+ ///
+ public string Description
+ {
+ get => this.description;
+ set => this.SetProperty(ref this.description, value);
+ }
+
+ ///
+ /// Gets or sets the general activity category.
+ ///
+ public string Category
+ {
+ get => this.category;
+ set => this.SetProperty(ref this.category, value);
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml b/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml
new file mode 100644
index 0000000..9d5dd67
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+ #2196F3
+ #96d1ff
+ #999999
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml.cs b/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml.cs
new file mode 100644
index 0000000..2bbcfb0
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/AboutPage.xaml.cs
@@ -0,0 +1,24 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Views
+{
+ using System.ComponentModel;
+ using Xamarin.Forms;
+
+ ///
+ /// About screen.
+ ///
+ [DesignTimeVisible(false)]
+ public partial class AboutPage : ContentPage
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public AboutPage()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml b/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml
new file mode 100644
index 0000000..c8b253f
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+ First Item
+ Second Item
+ Third Item
+ Fourth Item
+ Fifth Item
+ Sixth Item
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml.cs b/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml.cs
new file mode 100644
index 0000000..806e72f
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/ActivitiesPage.xaml.cs
@@ -0,0 +1,54 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Views
+{
+ using System;
+ using System.ComponentModel;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+ using SdgApps.TimeWise.ActivityJournal.ViewModels;
+ using Xamarin.Forms;
+
+ ///
+ /// Activities list screen.
+ ///
+ [DesignTimeVisible(false)]
+ public partial class ActivitiesPage : ContentPage
+ {
+ private readonly ActivitiesViewModel viewModel;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ActivitiesPage()
+ {
+ this.InitializeComponent();
+
+ this.BindingContext = this.viewModel = new ActivitiesViewModel();
+ }
+
+ ///
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+
+ if (this.viewModel.Activities.Count == 0)
+ {
+ this.viewModel.IsBusy = true;
+ }
+ }
+
+ private async void OnItemSelected(object sender, EventArgs args)
+ {
+ var layout = (BindableObject)sender;
+ var activity = (Activity)layout.BindingContext;
+ await this.Navigation.PushAsync(new ActivityDetailPage(new ActivityDetailViewModel(activity)));
+ }
+
+ private async void AddActivity_Clicked(object sender, EventArgs e)
+ {
+ await this.Navigation.PushModalAsync(new NavigationPage(new NewActivityPage()));
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml b/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml
new file mode 100644
index 0000000..c66c829
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml.cs b/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml.cs
new file mode 100644
index 0000000..edbed5c
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/ActivityDetailPage.xaml.cs
@@ -0,0 +1,52 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Views
+{
+ using System;
+ using System.ComponentModel;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+ using SdgApps.TimeWise.ActivityJournal.ViewModels;
+ using Xamarin.Forms;
+
+ ///
+ /// Activity details screen.
+ ///
+ [DesignTimeVisible(false)]
+ public partial class ActivityDetailPage : ContentPage
+ {
+ private readonly ActivityDetailViewModel viewModel;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Backing view model.
+ public ActivityDetailPage(ActivityDetailViewModel viewModel)
+ {
+ this.InitializeComponent();
+
+ this.BindingContext = this.viewModel = viewModel;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ActivityDetailPage()
+ {
+ this.InitializeComponent();
+
+ var activity = new Activity
+ {
+ Title = "Activity 1",
+ Start = DateTime.Now.AddHours(-1.0d),
+ End = DateTime.Now,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ };
+
+ this.viewModel = new ActivityDetailViewModel(activity);
+ this.BindingContext = this.viewModel;
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml b/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml
new file mode 100644
index 0000000..0cd32f3
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml.cs b/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml.cs
new file mode 100644
index 0000000..117500d
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/Views/NewActivityPage.xaml.cs
@@ -0,0 +1,65 @@
+//
+// Copyright (c) Soli Deo Gloria Apps. All rights reserved.
+//
+
+namespace SdgApps.TimeWise.ActivityJournal.Views
+{
+ using System;
+ using System.ComponentModel;
+ using SdgApps.TimeWise.ActivityJournal.Models;
+ using SdgApps.TimeWise.ActivityJournal.ViewModels;
+ using Xamarin.Forms;
+
+ ///
+ /// Add new activity screen.
+ ///
+ [DesignTimeVisible(false)]
+ public partial class NewActivityPage : ContentPage
+ {
+ private readonly NewActivityViewModel viewModel;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public NewActivityPage()
+ {
+ this.InitializeComponent();
+
+ var now = DateTime.Now;
+ var then = now.AddHours(-1.0d);
+
+ this.viewModel = new NewActivityViewModel
+ {
+ Title = "Activity name",
+ StartDate = then.Date,
+ StartTime = then.TimeOfDay,
+ EndDate = now.Date,
+ EndTime = now.TimeOfDay,
+ Description = "This is an activity description.",
+ Category = "Activity",
+ };
+
+ this.BindingContext = this.viewModel;
+ }
+
+ private async void Save_Clicked(object sender, EventArgs e)
+ {
+ var activity = new Activity
+ {
+ Title = this.viewModel.Title,
+ Start = this.viewModel.StartDate.Date + this.viewModel.StartTime,
+ End = this.viewModel.EndDate.Date + this.viewModel.EndTime,
+ Description = this.viewModel.Description,
+ Category = this.viewModel.Category,
+ };
+
+ MessagingCenter.Send(this, "AddActivity", activity);
+ await this.Navigation.PopModalAsync();
+ }
+
+ private async void Cancel_Clicked(object sender, EventArgs e)
+ {
+ await this.Navigation.PopModalAsync();
+ }
+ }
+}
diff --git a/SdgApps.TimeWise.ActivityJournal/stylecop.json b/SdgApps.TimeWise.ActivityJournal/stylecop.json
new file mode 100644
index 0000000..d6b3d43
--- /dev/null
+++ b/SdgApps.TimeWise.ActivityJournal/stylecop.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
+ "settings": {
+ "documentationRules": {
+ "companyName": "Soli Deo Gloria Apps"
+ },
+ "layoutRules": {
+ "newlineAtEndOfFile": "require"
+ }
+ }
+}