Add unit test case for RecentShortcutController.
authorChulSeung Kim <charles0.kim@samsung.com>
Mon, 5 Jun 2017 07:27:18 +0000 (16:27 +0900)
committerChulSeung Kim <charles0.kim@samsung.com>
Thu, 8 Jun 2017 09:34:56 +0000 (18:34 +0900)
Remove meaningless TODOs

Change-Id: I157ddce45ede7ac4967add7ba95e4c9986917e4f

52 files changed:
HomeUnitTest/HomeUnitTest.csproj [new file with mode: 0644]
HomeUnitTest/Properties/AssemblyInfo.cs [new file with mode: 0644]
HomeUnitTest/RecentTesting.cs [new file with mode: 0644]
HomeUnitTest/Settings.StyleCop [new file with mode: 0644]
HomeUnitTest/packages.config [new file with mode: 0644]
LibTVRefCommonPortable/DataModels/CommandAction.cs
LibTVRefCommonPortable/DataModels/ShortcutInfo.cs
LibTVRefCommonPortable/LibTVRefCommonPortable.csproj
LibTVRefCommonPortable/Models/AppShortcutController.cs
LibTVRefCommonPortable/Models/ManagedApps.cs
LibTVRefCommonPortable/Models/RecentShortcutController.cs
LibTVRefCommonPortable/Utils/AppShortcutStorage.cs
LibTVRefCommonPortable/Utils/ApplicationManagerUtils.cs
LibTVRefCommonPortable/Utils/DebuggingUtils.cs
LibTVRefCommonPortable/Utils/FileSystemUtils.cs [new file with mode: 0644]
LibTVRefCommonPortable/Utils/IPackageManager.cs
LibTVRefCommonPortable/Utils/IPlatformNotification.cs
LibTVRefCommonPortable/Utils/MediaContentUtils.cs [new file with mode: 0644]
LibTVRefCommonPortable/Utils/PackageManagerUtils.cs
LibTVRefCommonPortable/Utils/RecentShortcutStorage.cs
LibTVRefCommonPortable/Utils/SizeUtils.cs
LibTVRefCommonPortable/packages.config
LibTVRefCommonTizen/LibTVRefCommonTizen.nuget.targets
LibTVRefCommonTizen/LibTVRefCommonTizen.project.json
LibTVRefCommonTizen/Ports/AppControlPort.cs
LibTVRefCommonTizen/Ports/ApplicationManagerPort.cs
LibTVRefCommonTizen/Ports/PackageManagerPort.cs
TVApps/TVApps.TizenTV/TVApps.TizenTV.nuget.targets
TVApps/TVApps.TizenTV/TVApps.TizenTV.project.json
TVApps/TVApps/Controls/AppItemCell.xaml.cs
TVApps/TVApps/Controls/AppListView.xaml.cs
TVApps/TVApps/TVApps.csproj
TVApps/TVApps/ViewModels/AppsHolder.cs
TVApps/TVApps/ViewModels/MainPageViewModel.cs
TVApps/TVApps/Views/FooterNormalStatus.xaml.cs
TVApps/TVApps/Views/MainPage.xaml.cs
TVApps/TVApps/packages.config
TVHome/TVHome.TizenTV/Sniper.cs
TVHome/TVHome.TizenTV/SniperInterOp.cs
TVHome/TVHome.TizenTV/TVHome.TizenTV.csproj
TVHome/TVHome.TizenTV/TVHome.TizenTV.nuget.targets
TVHome/TVHome.TizenTV/TVHome.TizenTV.project.json
TVHome/TVHome.TizenTV/res/org.tizen.example.Butterfly.Tizen.png [deleted file]
TVHome/TVHome.TizenTV/res/org.tizen.example.Calculator.Tizen.png [deleted file]
TVHome/TVHome.TizenTV/res/org.tizen.example.HomeFitness.Tizen.png [deleted file]
TVHome/TVHome.TizenTV/res/org.tizen.example.Sports.Tizen.png [deleted file]
TVHome/TVHome.TizenTV/res/org.tizen.example.Toda.Tizen.png [deleted file]
TVHome/TVHome.TizenTV/res/org.tizen.example.YouTube.Tizen.png [deleted file]
TVHome/TVHome/TVHome.csproj
TVHome/TVHome/ViewModels/MainPageViewModel.cs
TVHome/TVHome/packages.config
TVHomeApps.sln

diff --git a/HomeUnitTest/HomeUnitTest.csproj b/HomeUnitTest/HomeUnitTest.csproj
new file mode 100644 (file)
index 0000000..7bf1694
--- /dev/null
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HomeUnitTest</RootNamespace>
+    <AssemblyName>HomeUnitTest</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;_TEST_</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
+    </Reference>
+    <Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="RecentTesting.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\LibTVRefCommonPortable\LibTVRefCommonPortable.csproj">
+      <Project>{67f9d3a8-f71e-4428-913f-c37ae82cdb24}</Project>
+      <Name>LibTVRefCommonPortable</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props'))" />
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets'))" />
+    <Error Condition="!Exists('..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
+  </Target>
+  <Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" />
+  <Import Project="..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+</Project>
\ No newline at end of file
diff --git a/HomeUnitTest/Properties/AssemblyInfo.cs b/HomeUnitTest/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..695ffc8
--- /dev/null
@@ -0,0 +1,21 @@
+// <auto-generated/>
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("HomeUnitTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HomeUnitTest")]
+[assembly: AssemblyCopyright("Copyright ©  2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: ComVisible(false)]
+
+[assembly: Guid("1f2db8a0-7d1e-4ba3-bf27-335d033c572c")]
+
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/HomeUnitTest/RecentTesting.cs b/HomeUnitTest/RecentTesting.cs
new file mode 100644 (file)
index 0000000..50f90b0
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using LibTVRefCommonPortable.Models;
+using LibTVRefCommonPortable.DataModels;
+using System.Linq;
+
+namespace HomeUnitTest
+{
+    [TestClass]
+    public class RecentTesting
+    {
+        public RecentTesting()
+        {
+
+        }
+
+        [TestMethod]
+        public void GetListTest()
+        {
+            RecentShortcutController recentShortcutController = new RecentShortcutController();
+
+            var recents = recentShortcutController.GetList();
+
+            // MAX number of recent = 10
+            if (recents.Count() > 10)
+            {
+                Assert.Fail("Too many Recent!!!, Returned = " + recents.Count());
+            }
+
+            bool isAllMedias = true;
+            bool isAllApps = true;
+
+            foreach (var recent in recents)
+            {
+                Console.Out.WriteLine("-----------------------------");
+                Console.Out.WriteLine("Type : " + recent.Type);
+                Console.Out.WriteLine("ID : " + recent.Id);
+                Console.Out.WriteLine("Date : " + recent.Date);
+                Console.Out.WriteLine("ScreenShot : " + recent.ScreenshotPath);
+
+                switch (recent.Type)
+                {
+                    case RecentShortcutType.Application:
+                        isAllMedias = false;
+                        break;
+                    case RecentShortcutType.Media:
+                        isAllApps = false;
+                        break;
+                }
+
+                // Invalid Recent(id, label has 'invalid') should not included!!!
+                if (recent.CurrentStateDescription == null ||
+                    recent.CurrentStateDescription.Label.ToLower().Contains("invalid"))
+                {
+                    Assert.Fail("Recent including invalid items!!!, " + recent.Id);
+                }
+            }
+
+            // Test Sample Recent is consist of App and Media types.
+            if (isAllMedias || isAllApps)
+            {
+                Assert.Fail("Invalid Recent list, All Media({0}), All Apps({1})", isAllMedias, isAllApps);
+            }
+        }
+    }
+}
diff --git a/HomeUnitTest/Settings.StyleCop b/HomeUnitTest/Settings.StyleCop
new file mode 100644 (file)
index 0000000..837530c
--- /dev/null
@@ -0,0 +1,722 @@
+<StyleCopSettings Version="105">
+  <GlobalSettings>
+    <StringProperty Name="MergeSettingsFiles">NoMerge</StringProperty>
+  </GlobalSettings>
+  <Analyzers>
+    <Analyzer AnalyzerId="StyleCop.CSharp.DocumentationRules">
+      <Rules>
+        <Rule Name="ElementsMustBeDocumented">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationMustHaveSummaryText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="EnumerationItemsMustBeDocumented">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationMustContainValidXml">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationMustHaveSummary">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PartialElementDocumentationMustHaveSummary">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationMustNotHaveDefaultSummary">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="VoidReturnValueMustNotBeDocumented">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="GenericTypeParametersMustBeDocumented">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="GenericTypeParametersMustBeDocumentedPartialClass">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="GenericTypeParameterDocumentationMustMatchTypeParameters">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="GenericTypeParameterDocumentationMustDeclareParameterName">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="GenericTypeParameterDocumentationMustHaveText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PropertySummaryDocumentationMustMatchAccessors">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationMustNotBeCopiedAndPasted">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SingleLineCommentsMustNotUseDocumentationStyleSlashes">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationTextMustNotBeEmpty">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationTextMustContainWhitespace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationMustMeetCharacterPercentage">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ConstructorSummaryDocumentationMustBeginWithStandardText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DestructorSummaryDocumentationMustBeginWithStandardText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationHeadersMustNotContainBlankLines">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="IncludedDocumentationXPathDoesNotExist">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="IncludeNodeDoesNotContainValidFileAndPath">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="InheritDocMustBeUsedWithInheritingClass">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationMustBeSpelledCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileMustHaveHeader">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderMustShowCopyright">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderMustHaveCopyrightText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderMustContainFileName">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderMustHaveValidCompanyText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileHeaderFileNameDocumentationMustMatchTypeName">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.NamingRules">
+      <Rules>
+        <Rule Name="ConstFieldNamesMustBeginWithUpperCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FieldNamesMustBeginWithLowerCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FieldNamesMustNotContainUnderscore">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementMustBeginWithLowerCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FieldNamesMustNotUseHungarianNotation">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="AccessibleFieldsMustBeginWithUpperCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="VariableNamesMustNotBePrefixed">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FieldNamesMustNotBeginWithUnderscore">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="StaticReadonlyFieldsMustBeginWithUpperCaseLetter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
+      <Rules>
+        <Rule Name="AllAccessorsMustBeMultiLineOrSingleLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningCurlyBracketsMustNotBeFollowedByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationHeadersMustNotBeFollowedByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainMultipleBlankLinesInARow">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingCurlyBracketsMustNotBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningCurlyBracketsMustNotBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ChainedStatementBlocksMustNotBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="WhileDoFooterMustNotBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SingleLineCommentsMustNotBeFollowedByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementDocumentationHeaderMustBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SingleLineCommentMustBePrecededByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementsMustBeSeparatedByBlankLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainBlankLinesAtStartOfFile">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainBlankLinesAtEndOfFile">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.MaintainabilityRules">
+      <Rules>
+        <Rule Name="AccessModifierMustBeDeclared">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FieldsMustBePrivate">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeAnalysisSuppressionMustHaveJustification">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DebugAssertMustProvideMessageText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DebugFailMustProvideMessageText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileMayOnlyContainASingleClass">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="FileMayOnlyContainASingleNamespace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="StatementMustNotUseUnnecessaryParenthesis">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ArithmeticExpressionsMustDeclarePrecedence">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ConditionalExpressionsMustDeclarePrecedence">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="RemoveDelegateParenthesisWhenPossible">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="AttributeConstructorMustNotUseUnnecessaryParenthesis">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="RemoveUnnecessaryCode">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.OrderingRules">
+      <Rules>
+        <Rule Name="UsingDirectivesMustBePlacedWithinNamespace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementsMustAppearInTheCorrectOrder">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ElementsMustBeOrderedByAccess">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ConstantsMustAppearBeforeFields">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="StaticElementsMustAppearBeforeInstanceElements">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DeclarationKeywordsMustFollowOrder">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ProtectedMustComeBeforeInternal">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PropertyAccessorsMustFollowOrder">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="EventAccessorsMustFollowOrder">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="NoValueFirstComparison">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UsingDirectivesMustBeOrderedAlphabeticallyByNamespace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UsingStaticDirectivesMustBePlacedAfterUsingNamespaceDirectives">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.ReadabilityRules">
+      <Rules>
+        <Rule Name="CommentsMustContainText">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DoNotPrefixCallsWithBaseUnlessLocalImplementationExists">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PrefixLocalCallsWithThis">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PrefixCallsCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningParenthesisMustBeOnDeclarationLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingParenthesisMustBeOnLineOfLastParameter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingParenthesisMustBeOnLineOfOpeningParenthesis">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CommaMustBeOnSameLineAsPreviousParameter">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ParameterListMustFollowDeclaration">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ParameterMustFollowComma">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ParameterMustNotSpanMultipleLines">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="QueryClauseMustFollowPreviousClause">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="QueryClausesMustBeOnSeparateLinesOrAllOnOneLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="QueryClauseMustBeginOnNewLineWhenPreviousClauseSpansMultipleLines">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="QueryClausesSpanningMultipleLinesMustBeginOnOwnLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DoNotPlaceRegionsWithinElements">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainEmptyStatements">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainMultipleStatementsOnOneLine">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="BlockStatementsMustNotContainEmbeddedComments">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="BlockStatementsMustNotContainEmbeddedRegions">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UseStringEmptyForEmptyStrings">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UseBuiltInTypeAlias">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="UseShorthandForNullableTypes">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+    <Analyzer AnalyzerId="StyleCop.CSharp.SpacingRules">
+      <Rules>
+        <Rule Name="CommasMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SemicolonsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DocumentationLinesMustBeginWithSingleSpace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="SingleLineCommentsMustBeginWithSingleSpace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PreprocessorKeywordsMustNotBePrecededBySpace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OperatorKeywordMustBeFollowedBySpace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningCurlyBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingCurlyBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningGenericBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingGenericBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="OpeningAttributeBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ClosingAttributeBracketsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="NullableTypeSymbolsMustNotBePrecededBySpace">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="MemberAccessSymbolsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="IncrementDecrementSymbolsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="NegativeSignsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="PositiveSignsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DereferenceAndAccessOfSymbolsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="ColonsMustBeSpacedCorrectly">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainMultipleWhitespaceInARow">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="CodeMustNotContainSpaceAfterNewKeywordInImplicitlyTypedArrayAllocation">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="TabsMustNotBeUsed">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+        <Rule Name="DoNotSplitNullConditionalOperators">
+          <RuleSettings>
+            <BooleanProperty Name="Enabled">False</BooleanProperty>
+          </RuleSettings>
+        </Rule>
+      </Rules>
+      <AnalyzerSettings />
+    </Analyzer>
+  </Analyzers>
+</StyleCopSettings>
\ No newline at end of file
diff --git a/HomeUnitTest/packages.config b/HomeUnitTest/packages.config
new file mode 100644 (file)
index 0000000..dab081a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="MSTest.TestAdapter" version="1.1.11" targetFramework="net461" />
+  <package id="MSTest.TestFramework" version="1.1.11" targetFramework="net461" />
+  <package id="Xamarin.Forms" version="2.3.5-r233-008" targetFramework="net461" />
+</packages>
\ No newline at end of file
index 8ad9efa..40585c9 100644 (file)
@@ -14,7 +14,9 @@
  * limitations under the License.
  */
 
+using System;
 using System.Windows.Input;
+using Xamarin.Forms;
 
 namespace LibTVRefCommonPortable.DataModels
 {
@@ -29,9 +31,9 @@ namespace LibTVRefCommonPortable.DataModels
         public string NextStateDescription { get; set; }
 
         /// <summary>
-        /// A Command.
+        /// A Command to be executed
         /// </summary>
-        public ICommand Command { get; set; }
+        public event EventHandler<String> Command;
 
         /// <summary>
         /// A Command parameter.
@@ -44,7 +46,7 @@ namespace LibTVRefCommonPortable.DataModels
         /// <returns>A next statue of a Shortcut.</returns>
         public string Execute()
         {
-            Command.Execute(CommandParameter);
+            Command?.Invoke(this, CommandParameter);
             return NextStateDescription;
         }
     }
index b110f36..00854f6 100644 (file)
@@ -87,16 +87,6 @@ namespace LibTVRefCommonPortable.DataModels
                 return true;
             }
 
-            // TODO : remove, for debugging purpose
-            foreach (var item in stateDescriptions)
-            {
-                if (item.Value.Equals(CurrentStateDescription))
-                {
-                    //DebuggingUtils.Dbg("[" + item.Key + "] => [" + state + "]");
-                    break;
-                }
-            }
-
             CurrentStateDescription = stateDescriptions[state];
             OnPropertyChanged("CurrentStateDescription");
             return true;
index 52a8703..f59578f 100755 (executable)
     <Compile Include="Utils\AppControlUtils.cs" />
     <Compile Include="Utils\ApplicationManagerUtils.cs" />
     <Compile Include="Utils\AppShortcutStorage.cs" />
+    <Compile Include="Utils\FileSystemUtils.cs" />
     <Compile Include="Utils\IMediaContentAPIs.cs" />
     <Compile Include="Utils\ISystemSettings.cs" />
+    <Compile Include="Utils\MediaContentUtils.cs" />
     <Compile Include="Utils\SizeUtils.cs" />
     <Compile Include="Utils\DateUtils.cs" />
     <Compile Include="Utils\DebuggingUtils.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Tizen.Xamarin.Forms.Extension, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-002\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
-  <Import Project="..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+  <Import Project="..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
       <ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
+    <Error Condition="!Exists('..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
   </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
index db256bb..21d63de 100755 (executable)
@@ -16,7 +16,6 @@
 
 using System;
 using System.Collections.Generic;
-using Xamarin.Forms;
 
 using LibTVRefCommonPortable.DataModels;
 using LibTVRefCommonPortable.Utils;
@@ -47,7 +46,7 @@ namespace LibTVRefCommonPortable.Models
         {
             List<AppShortcutInfo> appShortcutInfoList = new List<AppShortcutInfo>();
 
-            var installedAppList = await ApplicationManagerUtils.GetAllInstalledApplication();
+            var installedAppList = await ApplicationManagerUtils.Instance.GetAllInstalledApplication();
 
             foreach (KeyValuePair<string, string[]> item in installedAppList)
             {
@@ -74,7 +73,7 @@ namespace LibTVRefCommonPortable.Models
 
                 var appShortcutInfo = new AppShortcutInfo()
                 {
-                    IsRemovable = ApplicationManagerUtils.GetAppInfoRemovable(item.Key),
+                    IsRemovable = ApplicationManagerUtils.Instance.GetAppInfoRemovable(item.Key),
                     Installed = new DateTime(longDate),
                 };
 
@@ -173,6 +172,17 @@ namespace LibTVRefCommonPortable.Models
         /// <param name="returnPinnedAppsInfo">An App Shortcut list contains the additional Shortcuts.</param>
         private void AppendAddPinShortcut(ref List<ShortcutInfo> returnPinnedAppsInfo)
         {
+            var addPinCommandAction = new CommandAction()
+            {
+                NextStateDescription = "default",
+                CommandParameter = "",
+            };
+
+            addPinCommandAction.Command += new EventHandler<string>((s, e) =>
+            {
+                AppControlUtils.SendAddAppRequestToApps();
+            });
+
             var addPinShortcutInfo = new AppShortcutInfo()
             {
                 StateDescriptions =
@@ -183,15 +193,7 @@ namespace LibTVRefCommonPortable.Models
                         {
                             Label = "Add pin",
                             IconPath = "ic_home_menu_addpin_138.png",
-                            Action = new CommandAction()
-                            {
-                                NextStateDescription = "default",
-                                Command = new Command<string>((key) =>
-                                {
-                                    AppControlUtils.SendAddAppRequestToApps();
-                                }),
-                                CommandParameter = "",
-                            }
+                            Action = addPinCommandAction,
                         }
                     },
                     {
@@ -200,15 +202,7 @@ namespace LibTVRefCommonPortable.Models
                         {
                             Label = "Add pin",
                             IconPath = "ic_home_menu_addpin_182.png",
-                            Action = new CommandAction()
-                            {
-                                NextStateDescription = "default",
-                                Command = new Command<string>((key) =>
-                                {
-                                    AppControlUtils.SendAddAppRequestToApps();
-                                }),
-                                CommandParameter = "",
-                            }
+                            Action = addPinCommandAction,
                         }
                     },
                 }
@@ -237,7 +231,7 @@ namespace LibTVRefCommonPortable.Models
                     continue;
                 }
 
-                Dictionary<string, string> appInfo = ApplicationManagerUtils.GetInstalledApplication(appShortcutInfo.AppID);
+                Dictionary<string, string> appInfo = ApplicationManagerUtils.Instance.GetInstalledApplication(appShortcutInfo.AppID);
 
                 if (appInfo == null)
                 {
@@ -309,9 +303,7 @@ namespace LibTVRefCommonPortable.Models
         /// <returns>A hash table includes pinned app's app ID.</returns>
         public async Task<Dictionary<string, string>> GetPinnedAppsAppIDs()
         {
-            IApplicationManagerAPIs applicationManagerPort = DependencyService.Get<IApplicationManagerAPIs>();
             IEnumerable<AppShortcutInfo> pinned_apps_info = await AppShortcutStorage.Read();
-
             Dictionary<string, string> pinnedAppsDictionary = new Dictionary<string, string>();
 
             foreach (AppShortcutInfo appShortcutInfo in pinned_apps_info)
index 126187c..4f39126 100644 (file)
@@ -30,7 +30,6 @@ namespace LibTVRefCommonPortable.Models
         /// <summary>
         /// The app ID of TV reference home application
         /// </summary>
-        // TODO : change application later
         public static string TVHomeAppID
         {
             get
@@ -105,14 +104,6 @@ namespace LibTVRefCommonPortable.Models
                 return true;
             }
 
-            // TODO : remove this, only for TDC
-            if (appID.Contains("etflix") ||
-                  appID.StartsWith("org.volt") ||
-                    appID.StartsWith("org.tizen.emanual"))
-            {
-                return true;
-            }
-
             return false;
         }
     }
index ec69ecd..4fa5a06 100755 (executable)
  * limitations under the License.
  */
 
-using System;
 using System.Collections.Generic;
 using LibTVRefCommonPortable.DataModels;
 using LibTVRefCommonPortable.Utils;
 
-using Xamarin.Forms;
 
 namespace LibTVRefCommonPortable.Models
 {
@@ -31,19 +29,11 @@ namespace LibTVRefCommonPortable.Models
     public class RecentShortcutController
     {
         /// <summary>
-        /// A constructor
-        /// </summary>
-        public RecentShortcutController()
-        {
-        }
-
-        /// <summary>
         /// A method removes a Recent Shortcut.
         /// </summary>
         /// <param name="appId">a Recent Shortcut's appId to be removed.</param>
         public void Remove(string appId)
         {
-            //RecentShortcutStorage.Delete(history);
             RecentShortcutStorage.Delete(appId);
         }
 
@@ -56,159 +46,12 @@ namespace LibTVRefCommonPortable.Models
         }
 
         /// <summary>
-        /// A method updates Recent Shortcut.
-        /// </summary>
-        /// <param name="shortcut">A Recent Shortcut to be updated.</param>
-        /// <returns>A Status of Update</returns>
-        public bool Update(RecentShortcutInfo shortcut)
-        {
-            return RecentShortcutStorage.Update(shortcut);
-        }
-
-        /// <summary>
         /// A method provides a Recent Shortcut list.
         /// </summary>
         /// <returns>A Recent Shortcut list.</returns>
         public IEnumerable<RecentShortcutInfo> GetList()
         {
-            List<RecentShortcutInfo> recentShortcutInfoList = new List<RecentShortcutInfo>();
-            IEnumerable<RecentApp> recentApps = null;
-
-            try
-            {
-                recentApps = ApplicationManagerUtils.GetRecentApplications();
-            }
-            catch (Exception e)
-            {
-                DebuggingUtils.Err("GetRecentApplications failed. " + e.Message);
-            }
-
-            if (recentApps != null)
-            {
-                foreach (var item in recentApps)
-                {
-                    if (ManagedApps.IsHiddenRecentApp(item.AppID))
-                    {
-                        continue;
-                    }
-
-                    var defaultStateDescription = new StateDescription()
-                    {
-                        Label = item.Applabel,
-                        IconPath = item.IconPath,
-                        Action = new AppControlAction()
-                        {
-                            AppID = item.AppID,
-                        }
-                    };
-                    var recentShortcutInfo = new RecentShortcutInfo();
-
-                    if (item.ScreenShot == null)
-                    {
-                        recentShortcutInfo.ScreenshotPath = "screenshot.png";
-
-                        IFileSystemAPIs fsApi = DependencyService.Get<IFileSystemAPIs>();
-                        if (fsApi != null)
-                        {
-                            string capturedAppScreen = fsApi.PlatformShareStorage + item.AppID + ".jpg";
-                            if (fsApi.IsFileExist(capturedAppScreen))
-                            {
-                                recentShortcutInfo.ScreenshotPath = capturedAppScreen;
-                            }
-                            else
-                            {
-                                string testScreenShot = fsApi.AppResourceStorage + item.AppID + ".png";
-                                if (fsApi.IsFileExist(testScreenShot))
-                                {
-                                    recentShortcutInfo.ScreenshotPath = testScreenShot;
-                                }
-                            }
-                        }
-                    }
-                    else
-                    {
-                        recentShortcutInfo.ScreenshotPath = item.ScreenShot;
-                    }
-
-                    recentShortcutInfo.StateDescriptions.Add("default", defaultStateDescription);
-                    recentShortcutInfo.CurrentStateDescription = defaultStateDescription;
-                    recentShortcutInfo.Id = item.AppID;
-                    recentShortcutInfo.Date = item.LaunchedTime;
-                    recentShortcutInfoList.Add(recentShortcutInfo);
-                }
-            }
-            else
-            {
-                DebuggingUtils.Dbg("No recent apps");
-                var defaultStateDescription = new StateDescription()
-                {
-                    Label = "Youtube",
-                    IconPath = "ic_home_settings_all_138.png",
-                    Action = new AppControlAction()
-                    {
-                        AppID = "org.tizen.example.Youtube.TizenTV",
-                    }
-                };
-                var recentShortcutInfo = new RecentShortcutInfo();
-                string testScreenShot = "org.tizen.example.Youtube.Tizen.png";
-
-                recentShortcutInfo.ScreenshotPath = testScreenShot;
-
-                recentShortcutInfo.StateDescriptions.Add("default", defaultStateDescription);
-                recentShortcutInfo.CurrentStateDescription = defaultStateDescription;
-                recentShortcutInfo.Id = "org.tizen.example.Youtube.TizenTV";
-                recentShortcutInfoList.Add(recentShortcutInfo);
-            }
-
-            IMediaContentAPIs apiSet = DependencyService.Get<IMediaContentAPIs>();
-            var recentPlayedMedia = DependencyService.Get<IMediaContentAPIs>().GetRecentlyPlayedMedia(10);
-
-
-            foreach (var item in recentPlayedMedia)
-            {
-                // DebuggingUtils.Dbg("media :" + item.DisplayName + ", PlayedAt : " + item.PlayedAt.ToString());
-                var defaultStateDescription = new StateDescription()
-                {
-                    Label = item.DisplayName,
-                    IconPath = "ic_launcher_mediahub_138.png",
-                    Action = new MediaControlAction()
-                    {
-                        AppID = "org.tizen.xamediahub",
-                        FileUri = "file://" + item.FilePath,
-                    }
-                };
-                var mediaControlAction = defaultStateDescription.Action as MediaControlAction;
-
-                mediaControlAction.ExtraData.Add("View By", "All");
-                mediaControlAction.ExtraData.Add("Media type", "Video");
-                mediaControlAction.ExtraData.Add("Media Id", item.MediaId);
-
-                var recentShortcutInfo = new RecentShortcutInfo();
-
-                recentShortcutInfo.ScreenshotPath = item.FilePath + ".tn";
-
-                if (item.ThumbnailPath != null)
-                {
-                    IFileSystemAPIs fsApi = DependencyService.Get<IFileSystemAPIs>();
-                    if (fsApi != null)
-                    {
-                        if (fsApi.IsFileExist(item.ThumbnailPath))
-                        {
-                            recentShortcutInfo.ScreenshotPath = item.ThumbnailPath;
-                        }
-                    }
-                }
-
-                recentShortcutInfo.StateDescriptions.Add("default", defaultStateDescription);
-                recentShortcutInfo.CurrentStateDescription = defaultStateDescription;
-                recentShortcutInfo.Id = "org.tizen.xamediahub";
-                recentShortcutInfo.Date = item.PlayedAt.ToUniversalTime();
-                recentShortcutInfoList.Add(recentShortcutInfo);
-            }
-
-            recentShortcutInfoList.Sort();
-
-            return recentShortcutInfoList;
+            return RecentShortcutStorage.Read();
         }
     }
 }
index f415a44..47b9650 100644 (file)
@@ -59,8 +59,6 @@ namespace LibTVRefCommonPortable.Utils
         /// </summary>
         private AppShortcutStorage()
         {
-            // TODO : Make this working properly, an accessing below directory is not permitted.
-            //return DependencyService.Get<IFileSystemAPIs>()?.AppDataStorage + "pinned_apps_info.xml";
             StoragePath = DependencyService.Get<IFileSystemAPIs>()?.PlatformShareStorage + "pinned_apps_info.xml";
 
             fileSystemWatcher.Run();
index 4904fa4..62d8b80 100644 (file)
 
+using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Xamarin.Forms;
 
 namespace LibTVRefCommonPortable.Utils
 {
+    /// <summary>
+    /// A class provides application controlling functions
+    /// </summary>
     public sealed class ApplicationManagerUtils
     {
         /// <summary>
-        /// A constructor
+        /// A instance of platform specific application manager port.
         /// </summary>
-        public ApplicationManagerUtils()
+        private static IApplicationManagerAPIs applicationManagerAPIs;
+
+        /// <summary>
+        /// A instance of ApplicationManagerUtils
+        /// </summary>
+        private static readonly ApplicationManagerUtils instance = new ApplicationManagerUtils();
+
+        /// <summary>
+        /// A getter of ApplicationManagerUtils instance
+        /// </summary>
+        public static ApplicationManagerUtils Instance
         {
+            get
+            {
+                return instance;
+            }
         }
 
         /// <summary>
-        /// Gets the information of the recent applications
+        /// A unit testing stub of IApplicationManagerAPIs.
         /// </summary>
-        /// <returns>The list of the recent applications</returns>
-        public static IEnumerable<RecentApp> GetRecentApplications()
+        private class TestingStub : IApplicationManagerAPIs
         {
-            if (DependencyService.Get<IApplicationManagerAPIs>() == null)
+            public void DeleteAllRecentApplication()
+            {
+                throw new NotImplementedException();
+            }
+
+            public void DeleteRecentApplication(string appId)
+            {
+                throw new NotImplementedException();
+            }
+
+            public Task<Dictionary<string, string[]>> GetAllInstalledApplication()
+            {
+                throw new NotImplementedException();
+            }
+
+            public Task<string> GetAppIDbyAppLabel(string appLabel)
+            {
+                throw new NotImplementedException();
+            }
+
+            public bool GetAppInfoRemovable(string appID)
             {
-                return null;
+                throw new NotImplementedException();
             }
 
-            return DependencyService.Get<IApplicationManagerAPIs>().GetRecentApplications();
+            public Dictionary<string, string> GetInstalledApplication(string applicationId)
+            {
+                throw new NotImplementedException();
+            }
+
+            public IEnumerable<RecentApp> GetRecentApplications()
+            {
+                IList<RecentApp> testData = new List<RecentApp>();
+
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "recentapp1",
+                    InstanceLabel = "recentapp1",
+                    AppID = "org.tizen.recentapp1",
+                    Applabel = "recentapp1",
+                    IconPath = "/test/recentapp1",
+                    LaunchedTime = new DateTime(2014, 11, 12),
+                    Uri = "uri/recentapp1",
+                    ScreenShot = "screenshot/recentapp1",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "recentapp2.noscreenshot",
+                    InstanceLabel = "recentapp2.noscreenshot",
+                    AppID = "org.tizen.recentapp2.noscreenshot",
+                    Applabel = "recentapp2.noscreenshot",
+                    IconPath = "/test/recentapp2",
+                    LaunchedTime = new DateTime(2014, 11, 12),
+                    Uri = "uri/recentapp2",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "invalid.recentapp3.nolabel",
+                    AppID = "invalid.org.tizen.recentapp3.nolabel",
+                    IconPath = "/test/recentapp3",
+                    LaunchedTime = new DateTime(2014, 11, 12),
+                    Uri = "uri/recentapp3",
+                    ScreenShot = "screenshot/recentapp3",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "invalid.recentapp4.notime",
+                    AppID = "invalid.org.tizen.recentapp4.notime",
+                    Applabel = "recentapp4.notime",
+                    IconPath = "/test/recentapp4",
+                    Uri = "uri/recentapp4",
+                    ScreenShot = "screenshot/recentapp4",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "recentapp5",
+                    InstanceLabel = "recentapp5",
+                    AppID = "org.tizen.recentapp5",
+                    Applabel = "recentapp5",
+                    IconPath = "/test/recentapp5",
+                    LaunchedTime = new DateTime(2017, 05, 02),
+                    Uri = "uri/recentapp5",
+                    ScreenShot = "screenshot/recentapp5",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "recentapp6",
+                    InstanceLabel = "recentapp6",
+                    AppID = "org.tizen.recentapp6",
+                    Applabel = "recentapp6",
+                    IconPath = "/test/recentapp6",
+                    LaunchedTime = new DateTime(2017, 02, 26),
+                    Uri = "uri/recentapp6",
+                    ScreenShot = "screenshot/recentapp6",
+                });
+                testData.Add(new RecentApp
+                {
+                    InstanceID = "recentapp7",
+                    InstanceLabel = "recentapp7",
+                    AppID = "org.tizen.recentapp7",
+                    Applabel = "recentapp7",
+                    IconPath = "/test/recentapp7",
+                    LaunchedTime = new DateTime(2016, 04, 25),
+                    Uri = "uri/recentapp7",
+                    ScreenShot = "screenshot/recentapp7",
+                });
+
+                return testData;
+            }
         }
 
         /// <summary>
-        /// Gets the information of the specified application with the app ID
+        /// A constructor
         /// </summary>
-        /// <param name="appID">The app Id to get</param>
-        /// <returns>The information of the installed application</returns>
-        public static Dictionary<string, string> GetInstalledApplication(string appID)
+        private ApplicationManagerUtils()
         {
-            if (DependencyService.Get<IApplicationManagerAPIs>() == null)
+            applicationManagerAPIs = new TestingStub();
+
+            try
             {
-                return null;
+                if (DependencyService.Get<IApplicationManagerAPIs>() != null)
+                {
+                    applicationManagerAPIs = DependencyService.Get<IApplicationManagerAPIs>();
+                }
             }
+            catch (InvalidOperationException e)
+            {
+                DebuggingUtils.Err(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// A method for removing all recent applications
+        /// </summary>
+        public void DeleteAllRecentApplication()
+        {
+            applicationManagerAPIs.DeleteAllRecentApplication();
+        }
+
+        /// <summary>
+        /// A method for removing the specified recent application
+        /// </summary>
+        /// <param name="appId">An application ID</param>
+        public void DeleteRecentApplication(string appId)
+        {
+            applicationManagerAPIs.DeleteRecentApplication(appId);
+        }
 
-            return DependencyService.Get<IApplicationManagerAPIs>().GetInstalledApplication(appID);
+
+        /// <summary>
+        /// Gets the information of the recent applications
+        /// </summary>
+        /// <returns>The list of the recent applications</returns>
+        public IEnumerable<RecentApp> GetRecentApplications()
+        {
+            return applicationManagerAPIs.GetRecentApplications();
+        }
+
+        /// <summary>
+        /// Gets the information of the specified application with the app ID
+        /// </summary>
+        /// <param name="appID">The app Id to get</param>
+        /// <returns>The information of the installed application</returns>
+        public Dictionary<string, string> GetInstalledApplication(string appID)
+        {
+            return applicationManagerAPIs.GetInstalledApplication(appID);
         }
 
         /// <summary>
         /// Gets the information of the installed applications asynchronously
         /// </summary>
         /// <returns>The list of the installed applications</returns>
-        public static Task<Dictionary<string, string[]>> GetAllInstalledApplication()
+        public Task<Dictionary<string, string[]>> GetAllInstalledApplication()
         {
-            if (DependencyService.Get<IApplicationManagerAPIs>() == null)
-            {
-                return null;
-            }
-
-            return DependencyService.Get<IApplicationManagerAPIs>().GetAllInstalledApplication();
+            return applicationManagerAPIs.GetAllInstalledApplication();
         }
 
         /// <summary>
@@ -62,14 +219,9 @@ namespace LibTVRefCommonPortable.Utils
         /// </summary>
         /// <param name="appID">The app ID to get</param>
         /// <returns>If the application is removable, true; otherwise, false</returns>
-        public static bool GetAppInfoRemovable(string appID)
+        public bool GetAppInfoRemovable(string appID)
         {
-            if (DependencyService.Get<IApplicationManagerAPIs>() == null)
-            {
-                return false;
-            }
-
-            return DependencyService.Get<IApplicationManagerAPIs>().GetAppInfoRemovable(appID);
+            return applicationManagerAPIs.GetAppInfoRemovable(appID);
         }
 
         /// <summary>
@@ -77,14 +229,9 @@ namespace LibTVRefCommonPortable.Utils
         /// </summary>
         /// <param name="appLabel">the app label to get</param>
         /// <returns>the app ID of the app label</returns>
-        public static Task<string> GetAppIDbyAppLabel(string appLabel)
+        public Task<string> GetAppIDbyAppLabel(string appLabel)
         {
-            if (DependencyService.Get<IApplicationManagerAPIs>() == null)
-            {
-                return null;
-            }
-
-            return DependencyService.Get<IApplicationManagerAPIs>().GetAppIDbyAppLabel(appLabel);
+            return applicationManagerAPIs.GetAppIDbyAppLabel(appLabel);
         }
     }
 }
index 987251a..61418c6 100644 (file)
@@ -84,13 +84,18 @@ namespace LibTVRefCommonPortable.Utils
         /// </summary>
         private DebuggingUtils()
         {
-            if (DependencyService.Get<IDebuggingAPIs>() != null)
+            ism = new DefaultSM();
+
+            try
             {
-                ism = DependencyService.Get<IDebuggingAPIs>();
+                if (DependencyService.Get<IDebuggingAPIs>() != null)
+                {
+                    ism = DependencyService.Get<IDebuggingAPIs>();
+                }
             }
-            else
+            catch (InvalidOperationException e)
             {
-                ism = new DefaultSM();
+                Err(e.Message);
             }
         }
 
diff --git a/LibTVRefCommonPortable/Utils/FileSystemUtils.cs b/LibTVRefCommonPortable/Utils/FileSystemUtils.cs
new file mode 100644 (file)
index 0000000..3497da7
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace LibTVRefCommonPortable.Utils
+{
+    /// <summary>
+    /// A class for file system control function.
+    /// </summary>
+    class FileSystemUtils
+    {
+        /// <summary>
+        /// A instance of file system port layer
+        /// </summary>
+        private static IFileSystemAPIs fileSystemAPIs;
+
+        /// <summary>
+        /// A instance of FileSystemUtils
+        /// </summary>
+        private static readonly FileSystemUtils instance = new FileSystemUtils();
+
+        /// <summary>
+        /// A property of FileSystemUtils instance
+        /// </summary>
+        public static FileSystemUtils Instance
+        {
+            get
+            {
+                return instance;
+            }
+        }
+
+        /// <summary>
+        /// A unit test stub for FileSystemUtils
+        /// </summary>
+        private class TestStub : IFileSystemAPIs
+        {
+            /// <summary>
+            /// A directory path which should be used for app data storing.
+            /// </summary>
+            public string AppDataStorage
+            {
+                get
+                {
+                    return "test_app_data_path/";
+                }
+            }
+
+            /// <summary>
+            /// A directory path which should be used for app resource storing.
+            /// </summary>
+            public string AppResourceStorage
+            {
+                get
+                {
+                    return "test_app_resource_path/";
+                }
+            }
+
+            /// <summary>
+            /// A directory path which should be used for sharing between apps.
+            /// </summary>
+            public string PlatformShareStorage
+            {
+                get
+                {
+                    return "test_platform_share_path/";
+                }
+            }
+
+            /// <summary>
+            /// A method closes the file.
+            /// </summary>
+            /// <param name="stream">A file descriptor</param>
+            public void CloseFile(Stream stream)
+            {
+            }
+
+            /// <summary>
+            /// A method flushing the stream to write remains.
+            /// </summary>
+            /// <param name="stream">A file descriptor</param>
+            public void Flush(Stream stream)
+            {
+            }
+
+            /// <summary>
+            /// A method checks if a file existence in the file system.
+            /// </summary>
+            /// <param name="filePath">A file path</param>
+            /// <returns>An existence of the file</returns>
+            public bool IsFileExist(string filePath)
+            {
+                return true;
+            }
+
+            /// <summary>
+            /// A method checks if file is read to use.
+            /// </summary>
+            /// <param name="filePath">A file path</param>
+            /// <returns>A status of ready</returns>
+            public bool IsFileReady(string filePath)
+            {
+                return true;
+            }
+
+            /// <summary>
+            /// A method opens a file on the given mode.
+            /// </summary>
+            /// <param name="filePath">A file path</param>
+            /// <param name="mode">An opening mode</param>
+            /// <returns>A file descriptor</returns>
+            public Stream OpenFile(string filePath, UtilFileMode mode)
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        /// <summary>
+        /// A constructor
+        /// </summary>
+        private FileSystemUtils()
+        {
+            fileSystemAPIs = new TestStub();
+
+            try
+            {
+                if (DependencyService.Get<IFileSystemAPIs>() != null)
+                {
+                    fileSystemAPIs = DependencyService.Get<IFileSystemAPIs>();
+                }
+            }
+            catch (InvalidOperationException e)
+            {
+                DebuggingUtils.Err(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// A directory path which should be used for app data storing.
+        /// </summary>
+        public string AppDataStorage
+        {
+            get
+            {
+                return fileSystemAPIs.AppDataStorage;
+            }
+        }
+
+        /// <summary>
+        /// A directory path which should be used for app resource storing.
+        /// </summary>
+        public string AppResourceStorage
+        {
+            get
+            {
+                return fileSystemAPIs.AppResourceStorage;
+            }
+        }
+
+        /// <summary>
+        /// A directory path which should be used for sharing between apps.
+        /// </summary>
+        public string PlatformShareStorage
+        {
+            get
+            {
+                return fileSystemAPIs.PlatformShareStorage;
+            }
+        }
+
+        /// <summary>
+        /// A method opens a file on the given mode.
+        /// </summary>
+        /// <param name="filePath">A file path</param>
+        /// <param name="mode">An opening mode</param>
+        /// <returns>A file descriptor</returns>
+        public Stream OpenFile(string filePath, UtilFileMode mode)
+        {
+            return fileSystemAPIs.OpenFile(filePath, mode);
+        }
+
+        /// <summary>
+        /// A method flushing the stream to write remains.
+        /// </summary>
+        /// <param name="stream">A file descriptor</param>
+        public void Flush(Stream stream)
+        {
+            fileSystemAPIs.Flush(stream);
+        }
+
+        /// <summary>
+        /// A method closes the file.
+        /// </summary>
+        /// <param name="stream">A file descriptor</param>
+        public void CloseFile(Stream stream)
+        {
+            fileSystemAPIs.CloseFile(stream);
+        }
+
+        /// <summary>
+        /// A method checks if a file existence in the file system.
+        /// </summary>
+        /// <param name="filePath">A file path</param>
+        /// <returns>An existence of the file</returns>
+        public bool IsFileExist(String filePath)
+        {
+            return fileSystemAPIs.IsFileExist(filePath);
+        }
+
+        /// <summary>
+        /// A method checks if file is read to use.
+        /// </summary>
+        /// <param name="filePath">A file path</param>
+        /// <returns>A status of ready</returns>
+        public bool IsFileReady(String filePath)
+        {
+            return fileSystemAPIs.IsFileReady(filePath);
+        }
+
+
+    }
+}
index cfb14bd..a449672 100644 (file)
@@ -37,10 +37,10 @@ namespace LibTVRefCommonPortable.Utils
         string GetPackageLabel(string pkgID);
 
         /// <summary>
-        /// Gets the pacakge ID by the app ID
+        /// Gets the package ID by the app ID
         /// </summary>
         /// <param name="appID">The app ID to get</param>
-        /// <returns>The pacakge ID that contains given app ID</returns>
+        /// <returns>The package ID that contains given app ID</returns>
         string GetPackageIDByAppID(string appID);
 
         /// <summary>
index 9c1c07d..b5664e2 100755 (executable)
@@ -45,7 +45,7 @@ namespace LibTVRefCommonPortable.Utils
         void OnAppUninstalled(string pkgID);
 
         /// <summary>
-        /// A method will be called if the app gets a pin app App Control request.
+        /// A method will be called if the app gets a App Control request for pinning a app.
         /// </summary>
         void OnPinAppRequestReceived();
 
@@ -56,7 +56,7 @@ namespace LibTVRefCommonPortable.Utils
         void OnAppPinnedNotificationReceived(string appID);
 
         /// <summary>
-        /// A method will be called when the Nativation remote control key is pressed.
+        /// A method will be called when the Navigation remote control key is pressed.
         /// </summary>
         /// <param name="keyName">A pressed remote control key name</param>
         void OnNavigationKeyPressed(string keyName);
diff --git a/LibTVRefCommonPortable/Utils/MediaContentUtils.cs b/LibTVRefCommonPortable/Utils/MediaContentUtils.cs
new file mode 100644 (file)
index 0000000..c14b051
--- /dev/null
@@ -0,0 +1,141 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace LibTVRefCommonPortable.Utils
+{
+    /// <summary>
+    /// A class provides media contents and related functions.
+    /// </summary>
+    public class MediaContentUtils
+    {
+        /// <summary>
+        /// A instance of IMediaContentAPIs port.
+        /// </summary>
+        private static IMediaContentAPIs mediaContentAPIs;
+
+        /// <summary>
+        /// A instance of MediaContentUtils
+        /// </summary>
+        private static readonly MediaContentUtils instance = new MediaContentUtils();
+
+        /// <summary>
+        /// A property of MediaContentUtils instance.
+        /// </summary>
+        public static MediaContentUtils Instance
+        {
+            get
+            {
+                return instance;
+            }
+        }
+
+        /// <summary>
+        /// A unit testing stub for MediaContentUtils
+        /// </summary>
+        private class TestStub : IMediaContentAPIs
+        {
+            public IEnumerable<RecentlyPlayedMedia> GetRecentlyPlayedMedia(int limitation)
+            {
+                IList<RecentlyPlayedMedia> recentlyPlayed = new List<RecentlyPlayedMedia>();
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media1",
+                    ThumbnailPath = "thumbnail/recent_media1",
+                    FilePath = "filepath/recent_media1",
+                    DisplayName = "recent_media1",
+                    PlayedAt = new DateTime(2017, 05, 22),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "invalid.recent_media2.nofilepath",
+                    ThumbnailPath = "invalid.recent_media2.nofilepath",
+                    DisplayName = "invalid.recent_media2.nofilepath",
+                    PlayedAt = new DateTime(2017, 2, 26),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media3.nothumbnail",
+                    FilePath = "filepath/recent_media3.nothumbnail",
+                    DisplayName = "recent_media3.nothumbnail",
+                    PlayedAt = new DateTime(2016, 4, 25),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media4",
+                    ThumbnailPath = "thumbnail/recent_media4",
+                    FilePath = "filepath/recent_media4",
+                    DisplayName = "recent_media4",
+                    PlayedAt = new DateTime(2015, 12, 7),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media5",
+                    ThumbnailPath = "thumbnail/recent_media5",
+                    FilePath = "filepath/recent_media5",
+                    DisplayName = "recent_media5",
+                    PlayedAt = new DateTime(2015, 10, 1),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media6",
+                    ThumbnailPath = "thumbnail/recent_media6",
+                    FilePath = "filepath/recent_media6",
+                    DisplayName = "recent_media6",
+                    PlayedAt = new DateTime(2015, 3, 3),
+                });
+
+                recentlyPlayed.Add(new RecentlyPlayedMedia
+                {
+                    MediaId = "id/recent_media7",
+                    ThumbnailPath = "thumbnail/recent_media7",
+                    FilePath = "filepath/recent_media7",
+                    DisplayName = "recent_media8",
+                    PlayedAt = new DateTime(2014, 11, 17),
+                });
+
+                return recentlyPlayed;
+            }
+        }
+
+        /// <summary>
+        /// A Constructor
+        /// </summary>
+        private MediaContentUtils()
+        {
+            mediaContentAPIs = new TestStub();
+
+            try
+            {
+                if (DependencyService.Get<IMediaContentAPIs>() != null)
+                {
+                    mediaContentAPIs = DependencyService.Get<IMediaContentAPIs>();
+                }
+            }
+            catch (InvalidOperationException e)
+            {
+                DebuggingUtils.Err(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// A method provides media playing history.
+        /// </summary>
+        /// <param name="limitation">A number of getting media playing history</param>
+        /// <returns>A list of played medias.</returns>
+        public IEnumerable<RecentlyPlayedMedia> GetRecentlyPlayedMedia(int limitation)
+        {
+            return mediaContentAPIs.GetRecentlyPlayedMedia(limitation);
+        }
+
+    }
+}
index 36de825..50cd961 100644 (file)
@@ -87,7 +87,7 @@ namespace LibTVRefCommonPortable.Utils
         /// A method remove the package by using an app ID.
         /// </summary>
         /// <param name="appID">An app ID</param>
-        /// <returns>A status of uninstall</returns>
+        /// <returns>A status of uninstallation</returns>
         public static bool UninstallPackageByAppID(string appID)
         {
             if (DependencyService.Get<IPackageManager>() == null)
index 6fa8df4..b993aff 100755 (executable)
 
 using System.Collections.Generic;
 using LibTVRefCommonPortable.DataModels;
-using Xamarin.Forms;
+using System;
+using LibTVRefCommonPortable.Models;
 
 namespace LibTVRefCommonPortable.Utils
 {
     /// <summary>
     /// A class to manage the Recent Shortcuts.
     /// </summary>
-    public class RecentShortcutStorage
+    public sealed class RecentShortcutStorage
     {
         /// <summary>
-        /// A method creates the Recent Shortcut.
+        /// A maximum number of recent apps and contents
         /// </summary>
-        /// <returns>A status of Recent Shortcut creation.</returns>
-        public static bool Create()
-        {
-            // TODO : make a recent content
-            return false;
-        }
-
-        /// <summary>
-        /// A method provides a Recent Shortcut information which is matched with the given key.
-        /// </summary>
-        /// <param name="key">A recent shortcut's ID</param>
-        /// <returns>A Recent Shortcut Infomation</returns>
-        public static RecentShortcutInfo Read(string key)
-        {
-            RecentShortcutInfo recentShortcutInfo = new RecentShortcutInfo();
-            return recentShortcutInfo;
-        }
+        private static readonly int MaxRecents = 10;
 
         /// <summary>
         /// A method provides all Recent Shortcuts' information list.
@@ -52,19 +37,129 @@ namespace LibTVRefCommonPortable.Utils
         /// <returns>a Recent Shortcut information list.</returns>
         public static IEnumerable<RecentShortcutInfo> Read()
         {
-            List<RecentShortcutInfo> list = new List<RecentShortcutInfo>();
+            List<RecentShortcutInfo> recentShortcutInfoList = new List<RecentShortcutInfo>();
+            IEnumerable<RecentApp> recentApps = null;
 
-            return list;
-        }
+            try
+            {
+                recentApps = ApplicationManagerUtils.Instance.GetRecentApplications();
+            }
+            catch (Exception e)
+            {
+                DebuggingUtils.Err("GetRecentApplications failed. " + e.Message);
+            }
 
-        /// <summary>
-        /// A method updates a Recent Shortcut.
-        /// </summary>
-        /// <param name="shortcut">A recent Shortcut</param>
-        /// <returns>A status of update.</returns>
-        public static bool Update(ShortcutInfo shortcut)
-        {
-            return false;
+            if (recentApps != null)
+            {
+                foreach (var item in recentApps)
+                {
+                    if (ManagedApps.IsHiddenRecentApp(item.AppID))
+                    {
+                        continue;
+                    }
+
+                    if (item.Applabel == null || item.Applabel.Length == 0 ||
+                        item.LaunchedTime.CompareTo(new DateTime()) == 0 ||
+                        item.Uri == null || item.Uri.Length == 0)
+                    {
+                        continue;
+                    }
+
+                    var defaultStateDescription = new StateDescription()
+                    {
+                        Label = item.Applabel,
+                        IconPath = item.IconPath,
+                        Action = new AppControlAction()
+                        {
+                            AppID = item.AppID,
+                        }
+                    };
+                    var recentShortcutInfo = new RecentShortcutInfo();
+
+                    if (item.ScreenShot == null)
+                    {
+                        recentShortcutInfo.ScreenshotPath = "screenshot.png";
+
+                        string capturedAppScreen = FileSystemUtils.Instance.PlatformShareStorage + item.AppID + ".jpg";
+                        if (FileSystemUtils.Instance.IsFileExist(capturedAppScreen))
+                        {
+                            recentShortcutInfo.ScreenshotPath = capturedAppScreen;
+                        }
+                        else
+                        {
+                            string testScreenShot = FileSystemUtils.Instance.AppResourceStorage + item.AppID + ".png";
+                            if (FileSystemUtils.Instance.IsFileExist(testScreenShot))
+                            {
+                                recentShortcutInfo.ScreenshotPath = testScreenShot;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        recentShortcutInfo.ScreenshotPath = item.ScreenShot;
+                    }
+
+                    recentShortcutInfo.Type = RecentShortcutType.Application;
+                    recentShortcutInfo.StateDescriptions.Add("default", defaultStateDescription);
+                    recentShortcutInfo.CurrentStateDescription = defaultStateDescription;
+                    recentShortcutInfo.Id = item.AppID;
+                    recentShortcutInfo.Date = item.LaunchedTime;
+                    recentShortcutInfoList.Add(recentShortcutInfo);
+                }
+            }
+
+            IEnumerable<RecentlyPlayedMedia> recentMedias = MediaContentUtils.Instance.GetRecentlyPlayedMedia(MaxRecents);
+            foreach (var item in recentMedias)
+            {
+                if (item.FilePath == null || item.FilePath.Length == 0)
+                {
+                    continue;
+                }
+
+                // DebuggingUtils.Dbg("media :" + item.DisplayName + ", PlayedAt : " + item.PlayedAt.ToString());
+                var defaultStateDescription = new StateDescription()
+                {
+                    Label = item.DisplayName,
+                    IconPath = "ic_launcher_mediahub_138.png",
+                    Action = new MediaControlAction()
+                    {
+                        AppID = "org.tizen.xamediahub",
+                        FileUri = "file://" + item.FilePath,
+                    }
+                };
+                var mediaControlAction = defaultStateDescription.Action as MediaControlAction;
+
+                mediaControlAction.ExtraData.Add("View By", "All");
+                mediaControlAction.ExtraData.Add("Media type", "Video");
+                mediaControlAction.ExtraData.Add("Media Id", item.MediaId);
+
+                var recentShortcutInfo = new RecentShortcutInfo();
+
+                recentShortcutInfo.ScreenshotPath = item.FilePath + ".tn";
+
+                if (item.ThumbnailPath != null)
+                {
+                    if (FileSystemUtils.Instance.IsFileExist(item.ThumbnailPath))
+                    {
+                        recentShortcutInfo.ScreenshotPath = item.ThumbnailPath;
+                    }
+                }
+
+                recentShortcutInfo.Type = RecentShortcutType.Media;
+                recentShortcutInfo.StateDescriptions.Add("default", defaultStateDescription);
+                recentShortcutInfo.CurrentStateDescription = defaultStateDescription;
+                recentShortcutInfo.Id = "org.tizen.xamediahub";
+                recentShortcutInfo.Date = item.PlayedAt.ToUniversalTime();
+                recentShortcutInfoList.Add(recentShortcutInfo);
+            }
+
+            recentShortcutInfoList.Sort();
+            if (recentShortcutInfoList.Count > MaxRecents)
+            {
+                recentShortcutInfoList.RemoveRange(MaxRecents, recentShortcutInfoList.Count - MaxRecents);
+            }
+
+            return recentShortcutInfoList;
         }
 
         /// <summary>
@@ -73,8 +168,7 @@ namespace LibTVRefCommonPortable.Utils
         /// <param name="appId">An application ID</param>
         public static void Delete(string appId)
         {
-            IApplicationManagerAPIs applicationManagerPort = DependencyService.Get<IApplicationManagerAPIs>();
-            applicationManagerPort.DeleteRecentApplication(appId);
+            ApplicationManagerUtils.Instance.DeleteRecentApplication(appId);
         }
 
         /// <summary>
@@ -82,8 +176,7 @@ namespace LibTVRefCommonPortable.Utils
         /// </summary>
         public static void DeleteAll()
         {
-            IApplicationManagerAPIs applicationManagerPort = DependencyService.Get<IApplicationManagerAPIs>();
-            applicationManagerPort.DeleteAllRecentApplication();
+            ApplicationManagerUtils.Instance.DeleteAllRecentApplication();
         }
     }
 }
index 6eebc03..4ac601d 100644 (file)
@@ -120,7 +120,7 @@ namespace LibTVRefCommonPortable.Utils
         /// A method provides a converted height size.
         /// </summary>
         /// <param name="heightBaseSize">A height value in BaseScreen ratio</param>
-        /// <returns>A date</returns>
+        /// <returns>A converted height size</returns>
         public static int GetHeightSize(int heightBaseSize)
         {
             return Convert.ToInt32((double)((double)heightBaseSize / (double)BaseScreenHeight) * (double)(ScreenHeight));
@@ -130,12 +130,17 @@ namespace LibTVRefCommonPortable.Utils
         /// A method provides a converted width size.
         /// </summary>
         /// <param name="widthBaseSize">A width value in BaseScreen ratio</param>
-        /// <returns>A date</returns>
+        /// <returns>A converted width size</returns>
         public static int GetWidthSize(int widthBaseSize)
         {
             return Convert.ToInt32((double)((double)widthBaseSize / (double)BaseScreenWidth) * (double)(ScreenWidth));
         }
 
+        /// <summary>
+        /// A method provides a converted width size by double type.
+        /// </summary>
+        /// <param name="widthBaseSize">A width value in BaseScreen ratio</param>
+        /// <returns>A converted width size</returns>
         public static double GetWidthSizeDouble(double widthBaseSize)
         {
             return (double)(widthBaseSize / (double)BaseScreenWidth) * (double)(ScreenWidth);
@@ -145,7 +150,7 @@ namespace LibTVRefCommonPortable.Utils
         /// A method provides a converted font size.
         /// </summary>
         /// <param name="fontBaseSize">A base font size value in BaseScreen ratio</param>
-        /// <returns>A date</returns>
+        /// <returns>A converted font size</returns>
         public static int GetFontSize(int fontBaseSize)
         {
             switch (ModelName)
@@ -157,7 +162,6 @@ namespace LibTVRefCommonPortable.Utils
                 default:
                 case PlatformModel.Other:
                 case PlatformModel.TV:
-                    // TODO : Remove this if the TV/Other device's dpi is correctly changed.
                     //DebuggingUtils.Dbg(String.Format("TV/Other, fontBaseSize = {0}, BaseScreenHeight = {1}, ScreenHeight = {2}, ScaleRatio = {3}", fontBaseSize, BaseScreenHeight, ScreenHeight, ScaleRatio));
                     double tempAdjustmentRatio = 1D;
                     return Convert.ToInt32(((double)((double)fontBaseSize / (double)BaseScreenHeight) * (double)ScreenHeight) * ScaleRatio * tempAdjustmentRatio);
index 0dc7a5a..e9dfad3 100755 (executable)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-002" targetFramework="portable45-net45+win8+wp8+wpa81" />
-  <package id="Xamarin.Forms" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Xamarin.Forms" version="2.3.5-r233-008" targetFramework="portable45-net45+win8+wp8+wpa81" />
 </packages>
\ No newline at end of file
index 32bb521..13f049f 100644 (file)
@@ -3,7 +3,7 @@
   <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
     <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
     <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
-    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\git\home\LibTVRefCommonTizen\LibTVRefCommonTizen.project.lock.json</ProjectAssetsFile>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\_Data\csharp\spin_home\home\LibTVRefCommonTizen\LibTVRefCommonTizen.project.lock.json</ProjectAssetsFile>
     <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
     <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\samsung\.nuget\packages\</NuGetPackageFolders>
     <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">ProjectJson</NuGetProjectStyle>
@@ -13,6 +13,6 @@
     <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
   </PropertyGroup>
   <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
-    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   </ImportGroup>
 </Project>
\ No newline at end of file
index 4ec4d98..3531591 100644 (file)
@@ -1,12 +1,12 @@
 {
   "dependencies": {
-    "ElmSharp": "1.1.0-beta-021",
-    "Microsoft.NETCore.App": "1.1.0",
-    "Tizen": "1.0.3",
-    "Tizen.Applications": "1.5.1",
-    "Tizen.Content.MediaContent": "1.0.19",
-    "Xamarin.Forms": "2.3.5-r233-003",
-    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-003"
+    "ElmSharp": "1.2.0-beta-001",
+    "Microsoft.NETCore.App": "1.1.2",
+    "Tizen": "1.0.5",
+    "Tizen.Applications": "1.5.8",
+    "Tizen.Content.MediaContent": "1.0.20",
+    "Xamarin.Forms": "2.3.5-r233-008",
+    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-008"
   },
   "frameworks": {
     "netcoreapp1.0": {
index 96c9eb0..45dad8f 100644 (file)
@@ -23,14 +23,13 @@ using System.Collections.Generic;
 namespace LibTVRefCommonTizen.Ports
 {
     /// <summary>
-    /// Handles the Appcontrol APIs
+    /// Handles the AppControl APIs
     /// </summary>
     public class AppControlPort : IAppControl
     {
         /// <summary>
         /// The app ID of TV reference home application
         /// </summary>
-        // TODO : change application later
         public static string TVHomeAppID = "org.tizen.xahome";
 
         /// <summary>
@@ -40,13 +39,13 @@ namespace LibTVRefCommonTizen.Ports
 
         /// <summary>
         /// Represents the operation to be performed between TVHome and TVApps
-        /// This operation is sended from TVHomes to TVApps
+        /// This operation is sent from TVHomes to TVApps
         /// </summary>
         public static string AddAppOperation = "http://xahome.tizen.org/appcontrol/operation/add_app";
 
         /// <summary>
         /// Represents the operation to be performed between TVHome and TVApps
-        /// This operation is sended from TVApps to TVHome
+        /// This operation is sent from TVApps to TVHome
         /// </summary>
         public static string AppAddedNotifyOperation = "http://xahome.tizen.org/appcontrol/operation/app_added";
 
@@ -66,7 +65,7 @@ namespace LibTVRefCommonTizen.Ports
 
                 if (appId == null || appId.Length <= 0)
                 {
-                    DebuggingUtils.Err("The AppID is null or blank");
+                    DbgPort.E("The AppID is null or blank");
                     return;
                 }
 
@@ -97,7 +96,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (InvalidOperationException)
             {
-                DebuggingUtils.Err("Failed to create AppControl");
+                DbgPort.E("Failed to create AppControl");
             }
         }
 
index 72e833a..9e5cb9b 100755 (executable)
@@ -53,7 +53,7 @@ namespace LibTVRefCommonTizen.Ports
         void OnApplicationLaunched(object sender, EventArgs args)
         {
             ApplicationLaunchedEventArgs launchedEventArgs = args as ApplicationLaunchedEventArgs;
-            DebuggingUtils.Dbg(launchedEventArgs.ApplicationRunningContext.ApplicationId + " launched");
+            DbgPort.D(launchedEventArgs.ApplicationRunningContext.ApplicationId + " launched");
         }
 
         /// <summary>
@@ -67,7 +67,7 @@ namespace LibTVRefCommonTizen.Ports
         /// <summary>
         /// Removes the specified application with the app ID
         /// </summary>
-        /// <param name="appId">An alication ID that is removed</param>
+        /// <param name="appId">An application ID that is removed</param>
         public void DeleteRecentApplication(string appId)
         {
             IEnumerable<RecentApplicationInfo> recentApps = ApplicationManager.GetRecentApplications();
@@ -117,7 +117,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (InvalidOperationException)
             {
-                DebuggingUtils.Err("Failed to get the information of the recent applications");
+                DbgPort.E("Failed to get the information of the recent applications");
                 return null;
             }
 
index b8dc1b1..a8719b7 100644 (file)
@@ -150,7 +150,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (Exception e)
             {
-                DebuggingUtils.Err("Failed to get package information(" + pkgID + ") : " + e.Message);
+                DbgPort.E("Failed to get package information(" + pkgID + ") : " + e.Message);
 
                 return null;
             }
@@ -169,7 +169,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (Exception e)
             {
-                DebuggingUtils.Err("Failed to get the package ID by app ID(" + appID + ") : " + e.Message);
+                DbgPort.E("Failed to get the package ID by app ID(" + appID + ") : " + e.Message);
 
                 return null;
             }
@@ -190,7 +190,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (Exception e)
             {
-                DebuggingUtils.Err("Failed to get package information(" + pkgID + ") : " + e.Message);
+                DbgPort.E("Failed to get package information(" + pkgID + ") : " + e.Message);
 
                 return false;
             }
@@ -212,7 +212,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (Exception e)
             {
-                DebuggingUtils.Err("Failed to uninstall by AppID(" + appID + ") : " + e.Message);
+                DbgPort.E("Failed to uninstall by AppID(" + appID + ") : " + e.Message);
 
                 return false;
             }
@@ -233,7 +233,7 @@ namespace LibTVRefCommonTizen.Ports
                 IEnumerable<ApplicationInfo> appsList = pkg.GetApplications();
                 if (appsList == null)
                 {
-                    DebuggingUtils.Err("Failed to get apps list(" + pkgID + ")");
+                    DbgPort.E("Failed to get apps list(" + pkgID + ")");
 
                     return null;
                 }
@@ -241,7 +241,7 @@ namespace LibTVRefCommonTizen.Ports
                 foreach (var app in appsList)
                 {
                     apps.Add(app.ApplicationId);
-                    DebuggingUtils.Dbg("[" + index + "] " + app.ApplicationId);
+                    DbgPort.D("[" + index + "] " + app.ApplicationId);
                     index++;
                 }
 
@@ -249,7 +249,7 @@ namespace LibTVRefCommonTizen.Ports
             }
             catch (Exception e)
             {
-                DebuggingUtils.Err("Failed to get the package information(" + pkgID + ") : " + e.Message);
+                DbgPort.E("Failed to get the package information(" + pkgID + ") : " + e.Message);
 
                 return new List<string>();
             }
index 2d54ce4..596d878 100644 (file)
@@ -3,7 +3,7 @@
   <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
     <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
     <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
-    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\git\home\TVApps\TVApps.TizenTV\TVApps.TizenTV.project.lock.json</ProjectAssetsFile>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\_Data\csharp\spin_home\home\TVApps\TVApps.TizenTV\TVApps.TizenTV.project.lock.json</ProjectAssetsFile>
     <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
     <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\samsung\.nuget\packages\</NuGetPackageFolders>
     <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">ProjectJson</NuGetProjectStyle>
@@ -13,6 +13,6 @@
     <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
   </PropertyGroup>
   <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
-    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   </ImportGroup>
 </Project>
\ No newline at end of file
index e049334..28ae18a 100644 (file)
@@ -6,11 +6,11 @@
     "preserveCompilationContext": true
   },
   "dependencies": {
-    "ElmSharp": "1.1.0-beta-021",
-    "Microsoft.NETCore.App": "1.1.0",
-    "Tizen.Xamarin.Forms.Extension": "2.3.5-r233-002",
-    "Xamarin.Forms": "2.3.5-r233-003",
-    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-003"
+    "ElmSharp": "1.2.0-beta-001",
+    "Microsoft.NETCore.App": "1.1.2",
+    "Tizen.Xamarin.Forms.Extension": "2.3.5-r233-003",
+    "Xamarin.Forms": "2.3.5-r233-008",
+    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-008"
   },
   "runtimes": {
     "win": {},
index 048ad03..b53e59e 100755 (executable)
@@ -371,7 +371,6 @@ namespace TVApps.Controls
 
             popup.Items.Add(new ContextPopupItem("DELETE"));
 
-            //TODO: need to change the event callback
             popup.SelectedIndexChanged += (s, args) =>
             {
                 var ctxPopup = s as ContextPopup;
index df96e6d..7dade6d 100755 (executable)
@@ -114,9 +114,7 @@ namespace TVApps.Controls
         {
             InitializeComponent();
 
-            // TODO : set proper size
             Thickness padding = new Thickness(SizeUtils.GetHeightSize(58), 0, SizeUtils.GetHeightSize(58), 0);
-            // TODO : set proper size
             int spacing = SizeUtils.GetWidthSize(16);
 
             AppUpperList.Padding = padding;
index c2fd63b..e5bfb48 100755 (executable)
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Tizen.Xamarin.Forms.Extension, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-002\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
-  <Import Project="..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+  <Import Project="..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
       <ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
+    <Error Condition="!Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
   </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
                Other similar extension points exist, see Microsoft.Common.targets.
index 0117ca9..68acc45 100755 (executable)
@@ -118,53 +118,59 @@ namespace TVApps.ViewModels
 
                 item.IsPinned = PinnedApps.ContainsKey(item.AppID);
 
+                CommandAction pinAction = new CommandAction()
+                {
+                    NextStateDescription = AppsStatus.Pin.ToString().ToLower(),
+                    CommandParameter = item.AppID
+                };
+                pinAction.Command += new System.EventHandler<string>((s, arg) =>
+                {
+                    PinToggle(arg);
+                });
+
                 var pinStateDescription = new StateDescription()
                 {
                     Label = item.CurrentStateDescription.Label,
                     IconPath = item.CurrentStateDescription.IconPath,
-                    Action = new CommandAction()
-                    {
-                        NextStateDescription = AppsStatus.Pin.ToString().ToLower(),
-                        Command = new Command<string>((key) =>
-                        {
-                            PinToggle(key);
-                        }),
-                        CommandParameter = item.AppID
-                    }
+                    Action = pinAction,
                 };
 
                 item.StateDescriptions.Add(AppsStatus.Pin.ToString().ToLower(), pinStateDescription);
 
+                CommandAction checkDeleteAction = new CommandAction()
+                {
+                    NextStateDescription = AppsStatus.Delete.ToString().ToLower(),
+                    CommandParameter = item.AppID
+                };
+                checkDeleteAction.Command += new System.EventHandler<string>((s, arg) =>
+                {
+                    CheckDeleteApp(arg);
+                });
+
                 var deleteStateDescription = new StateDescription()
                 {
                     Label = item.CurrentStateDescription.Label,
                     IconPath = item.CurrentStateDescription.IconPath,
-                    Action = new CommandAction()
-                    {
-                        NextStateDescription = AppsStatus.Delete.ToString().ToLower(),
-                        Command = new Command<string>((key) =>
-                        {
-                            CheckDeleteApp(key);
-                        }),
-                        CommandParameter = item.AppID
-                    }
+                    Action = checkDeleteAction,
                 };
 
                 item.StateDescriptions.Add(AppsStatus.Delete.ToString().ToLower(), deleteStateDescription);
 
+                CommandAction longPressAction = new CommandAction()
+                {
+                    NextStateDescription = AppsStatus.LongPress.ToString().ToLower(),
+                    CommandParameter = item.AppID
+                };
+                pinAction.Command += new System.EventHandler<string>((s, arg) =>
+                {
+                    LongPressApp(arg);
+                });
+
                 var longPressStateDescription = new StateDescription()
                 {
                     Label = item.CurrentStateDescription.Label,
                     IconPath = item.CurrentStateDescription.IconPath,
-                    Action = new CommandAction()
-                    {
-                        NextStateDescription = AppsStatus.LongPress.ToString().ToLower(),
-                        Command = new Command<string>((key) =>
-                        {
-                            LongPressApp(key);
-                        }),
-                        CommandParameter = item.AppID
-                    }
+                    Action = longPressAction,
                 };
                 item.StateDescriptions.Add(AppsStatus.LongPress.ToString().ToLower(), longPressStateDescription);
             }
@@ -199,12 +205,13 @@ namespace TVApps.ViewModels
             }
             else
             {
-                if(PinnedApps.Count >= 10)
+                if (PinnedApps.Count >= 10)
                 {
                     IsSelectedExceeds = true;
                     ViewModel.OnPropertyChanged("IsSelectedExceeds");
                     return;
                 }
+
                 DebuggingUtils.Dbg("Pin! : " + selectedApp);
                 selectedApp.IsChecked = true;
                 selectedApp.IsPinned = true;
@@ -286,14 +293,14 @@ namespace TVApps.ViewModels
         {
             DebuggingUtils.Dbg("check that the app( " + appID + ") can be deleted");
 
-            if (!ApplicationManagerUtils.GetAppInfoRemovable(appID))
+            if (!ApplicationManagerUtils.Instance.GetAppInfoRemovable(appID))
             {
                 DebuggingUtils.Dbg("This app is not removable : " + appID);
                 return;
             }
 
             string appLabel = null;
-            if (ApplicationManagerUtils.GetInstalledApplication(appID).TryGetValue("Label", out appLabel))
+            if (ApplicationManagerUtils.Instance.GetInstalledApplication(appID).TryGetValue("Label", out appLabel))
             {
                 ViewModel.ShowDeletePopup(appLabel);
             }
@@ -351,7 +358,6 @@ namespace TVApps.ViewModels
         /// <param name="AppID">The ID of application for showing option menu</param>
         private void LongPressApp(string AppID)
         {
-            // TODO:
             DebuggingUtils.Dbg(" +++++ long press app : " + AppID);
         }
 
@@ -363,7 +369,6 @@ namespace TVApps.ViewModels
         {
             string tag = status.ToString().ToLower();
 
-            // TODO : remove this code. this code is temporary.
             if (status == AppsStatus.LongPress)
             {
                 AppShortcutInfo focuesedApp = InstalledApps.Find(a => a.IsFocused);
index 626a8b2..a61490a 100755 (executable)
@@ -296,6 +296,7 @@ namespace TVApps.ViewModels
                     AppControlUtils.SendAppAddedNotificationToHome("org.tizen.settings");
                     AppControlUtils.SelfTerminate();
                 }
+
                 SetFocusOptionButton = true;
                 OnPropertyChanged("SetFocusOptionButton");
 
@@ -339,7 +340,7 @@ namespace TVApps.ViewModels
                     return;
                 }
 
-                string appId = await ApplicationManagerUtils.GetAppIDbyAppLabel(appLabel);
+                string appId = await ApplicationManagerUtils.Instance.GetAppIDbyAppLabel(appLabel);
                 if (appId == null)
                 {
                     DebuggingUtils.Err("Failed to get the app ID by app label : " + appLabel);
index 733e38a..4dedfc9 100755 (executable)
@@ -165,7 +165,6 @@ namespace TVApps.Views
             popup.Items.Add(new ContextPopupItem("PIN"));
             popup.Items.Add(new ContextPopupItem("           DELETE           "));
 
-            //TODO: need to change the event callback
             popup.SelectedIndexChanged += (s, args) =>
             {
                 var ctxPopup = s as ContextPopup;
index 3ec14c3..fa76298 100755 (executable)
@@ -160,7 +160,6 @@ namespace TVApps.Views
             PropertyChanged += MainPagePropertyChanged;
             SetCurrentStatus(AppsStatus.Default);
 
-            // TODO: This code is temporary for menu option test
             App.SetMenuKeyListener((e, arg) =>
             {
                 DebuggingUtils.Dbg("[Apps] Menu key is pressed");
index 0dc7a5a..e9dfad3 100755 (executable)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-002" targetFramework="portable45-net45+win8+wp8+wpa81" />
-  <package id="Xamarin.Forms" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Xamarin.Forms" version="2.3.5-r233-008" targetFramework="portable45-net45+win8+wp8+wpa81" />
 </packages>
\ No newline at end of file
index 461b623..76017f0 100644 (file)
@@ -6,308 +6,308 @@ using Tizen;
 
 namespace CoreApp
 {
-    /// <summary>
-    /// Handles recent screen shot of launched applications
-    /// </summary>
-    public class Sniper
-    {
-        /// <summary>
-        /// Main window of the application
-        /// </summary>
-        private IntPtr nativeWindow;
-
-        /// <summary>
-        /// A path of storage for recent screen shot of launched application
-        /// </summary>
-        private string storagePath;
-
-        /// <summary>
-        /// A width of recent screen shot
-        /// </summary>
-        private int imageWidth;
-
-        /// <summary>
-        /// A height of recent screen shot
-        /// </summary>
-        private int imageHeight;
-
-        /// <summary>
-        /// A flag indicates whether updating recent screen shot or not
-        /// </summary>
-        public bool SkipUpdateFlag;
-
-        /// <summary>
-        /// Callbacks of sniper events
-        /// </summary>
+       /// <summary>
+       /// Handles recent screen shot of launched applications
+       /// </summary>
+       public class Sniper
+       {
+               /// <summary>
+               /// Main window of the application
+               /// </summary>
+               private IntPtr nativeWindow;
+
+               /// <summary>
+               /// A path of storage for recent screen shot of launched application
+               /// </summary>
+               private string storagePath;
+
+               /// <summary>
+               /// A width of recent screen shot
+               /// </summary>
+               private int imageWidth;
+
+               /// <summary>
+               /// A height of recent screen shot
+               /// </summary>
+               private int imageHeight;
+
+               /// <summary>
+               /// A flag indicates whether updating recent screen shot or not
+               /// </summary>
+               public bool SkipUpdateFlag;
+
+               /// <summary>
+               /// Callbacks of sniper events
+               /// </summary>
                private static InterOp.SniperCallback callbacks;
 
-        /// <summary>
-        /// A EventHandler handles recent screen shot update event
-        /// </summary>
-        public event EventHandler<Event> UpdatedEvent;
-
-        /// <summary>
-        /// A EventHandler handles add or remove application
-        /// </summary>
-        public event EventHandler<Event> AddRemoveEvent;
-
-        /// <summary>
-        /// A EventHandler handles skip update event
-        /// </summary>
-        public event EventHandler<Event> SkipUpdateEvent;
-
-        /// <summary>
-        /// TODO : Comment this
-        /// </summary>
-        public class Event : EventArgs
-        {
-            public string AppId;
-            public string InstanceId;
-            public string Info;
-        }
-
-        /// <summary>
-        /// A method for writing debug log
-        /// </summary>
-        /// <param name="message">A log message</param>
-        /// <param name="file">A path of caller file</param>
-        /// <param name="func">A name of caller function</param>
-        /// <param name="line">A line number of caller line</param>
-        private void WriteLog(string message, [CallerFilePath] string file = "", [CallerMemberName] string func = "", [CallerLineNumber] int line = 0)
-        {
-            Log.Debug("sniper", message);
-        }
-
-        /// <summary>
-        /// A method for handling launched application
-        /// </summary>
-        /// <param name="appId">An ID of launched application</param>
-        /// <param name="instanceId">An instance ID of launched application</param>
-        private void AddedCallback(string appId, string instanceId)
-        {
-            EventHandler<Event> handler = AddRemoveEvent;
-            Event eventInfo;
-
-            WriteLog("Added " + appId + " " + instanceId);
-
-            if (handler == null)
-            {
-                return;
-            }
-
-            try
-            {
-                eventInfo = new Event();
-            }
-            catch (Exception e)
-            {
-                WriteLog("Updated Exception : " + e.Message);
-                return;
-            }
-
-            eventInfo.AppId = appId;
-            eventInfo.InstanceId = instanceId;
-            eventInfo.Info = "Added";
-
-            handler(this, eventInfo);
-        }
-
-        /// <summary>
-        /// A method for handling terminated application
-        /// </summary>
-        /// <param name="appId">An ID of terminated application</param>
-        /// <param name="instanceId">An instance ID of terminated application</param>
-        private void RemovedCallback(string appId, string instanceId)
-        {
-            EventHandler<Event> handler = AddRemoveEvent;
-            Event eventInfo;
-
-            WriteLog("Removed " + appId + " " + instanceId);
-
-            if (handler == null)
-            {
-                return;
-            }
-
-            try
-            {
-                eventInfo = new Event();
-            }
-            catch (Exception e)
-            {
-                WriteLog("Updated Exception : " + e.Message);
-                return;
-            }
-
-            eventInfo.AppId = appId;
-            eventInfo.InstanceId = instanceId;
-            eventInfo.Info = "Removed";
-
-            handler(this, eventInfo);
-        }
-
-        /// <summary>
-        /// A method for handling application screen is updated
-        /// </summary>
-        /// <param name="appId">An ID of application that screen is updated</param>
-        /// <param name="instanceId">An instance ID of application that screen is updated</param>
-        /// <param name="Filename">A path of application screen shot</param>
-        private void UpdatedCallback(string appId, string instanceId, string Filename)
-        {
-            EventHandler<Event> handler = UpdatedEvent;
-            Event eventInfo;
-
-            WriteLog("Updated " + appId + " " + instanceId + " " + Filename);
-
-            if (handler == null)
-            {
-                return;
-            }
-
-            try
-            {
-                eventInfo = new Event();
-            }
-            catch (Exception e)
-            {
-                WriteLog("Updated Exception : " + e.Message);
-                return;
-            }
-
-            eventInfo.Info = Filename;
-            eventInfo.AppId = appId;
-            eventInfo.InstanceId = instanceId;
-
-            handler(this, eventInfo);
-        }
-
-        /// <summary>
-        /// A method for handling screen update is skipped
-        /// </summary>
-        /// <param name="appId">An ID of application that screen update is skipped</param>
-        /// <param name="instanceId">An instance ID of application that screen update is skipped</param>
-        /// <param name="Filename">A path of application screen shot</param>
-        /// <returns>Returns finish code</returns>
-        private int SkipUpdateCallback(string appId, string instanceId, string Filename)
-        {
-            EventHandler<Event> handler = SkipUpdateEvent;
-            Event eventInfo;
-
-            WriteLog("SkipUpdate" + appId + " " + instanceId + " " + Filename);
-
-            if (handler == null)
-            {
-                return 0;
-            }
-
-            try
-            {
-                eventInfo = new Event();
-            }
-            catch (Exception e)
-            {
-                WriteLog("SkipUpdated Exception : " + e.Message);
-                return 0;
-            }
-
-            eventInfo.Info = Filename;
-            eventInfo.AppId = appId;
-            eventInfo.InstanceId = instanceId;
-
-            handler(this, eventInfo);
-
-            if (SkipUpdateFlag)
-            {
-                WriteLog("Update is skipped : " + Filename);
-                SkipUpdateFlag = false;
-                return 1;
-            }
-
-            return 0;
-        }
-
-        /// <summary>
-        /// Constructor
-        /// </summary>
-        /// <param name="window">Main window of this application</param>
-        /// <param name="path">Storage path</param>
-        /// <param name="width">Screen shot width</param>
-        /// <param name="height">Screen shot height</param>
-        public Sniper(IntPtr window, string path, int width, int height)
-        {
-            nativeWindow = window;
-            storagePath = path;
-            imageWidth = width;
-            imageHeight = height;
-            SkipUpdateFlag = false;
-        }
-
-        /// <summary>
-        /// A method for starting monitoring
-        /// Adds callbacks and initialize Sniper class
-        /// </summary>
-        public void StartMonitor()
-        {
-            try
-            {
-                callbacks = new InterOp.SniperCallback();
-                callbacks.Added = new InterOp.CallbackAddedRemoved(AddedCallback);
-                callbacks.Removed = new InterOp.CallbackAddedRemoved(RemovedCallback);
-                callbacks.Updated = new InterOp.CallbackUpdated(UpdatedCallback);
-                callbacks.SkipUpdate = new InterOp.CallbackSkipUpdate(SkipUpdateCallback);
-            }
-            catch (Exception e)
-            {
-                throw new SniperException(e.Message);
-            }
-
-            try
-            {
-                InterOp.sniper_init(nativeWindow, callbacks, storagePath, imageWidth, imageHeight);
-            }
-            catch (DllNotFoundException e)
-            {
-                WriteLog("Loadable library is not found " + e.StackTrace);
-            }
-
-            WriteLog("Sniper starts monitoring : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
-        }
-
-        /// <summary>
-        /// A method stops monitoring
-        /// </summary>
-        public void StopMonitor()
-        {
-            try
-            {
-                InterOp.sniper_fini();
-            }
-            catch (DllNotFoundException e)
-            {
-                WriteLog("Loadable library is not found " + e.StackTrace);
-            }
-
-            WriteLog("Sniper stops monitoring : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
-        }
-
-        /// <summary>
-        /// A method requests updating application screen shot
-        /// </summary>
-        /// <param name="instanceId">An instance ID of application</param>
-        public void RequestUpdate(string instanceId)
-        {
-            try
-            {
-                InterOp.sniper_request_update(instanceId);
-            }
-            catch (DllNotFoundException e)
-            {
-                WriteLog("Loadable library is not found " + e.StackTrace);
-            }
-
-            WriteLog("Sniper requests update (" + instanceId + ") : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
-        }
-    }
+               /// <summary>
+               /// A EventHandler handles recent screen shot update event
+               /// </summary>
+               public event EventHandler<Event> UpdatedEvent;
+
+               /// <summary>
+               /// A EventHandler handles add or remove application
+               /// </summary>
+               public event EventHandler<Event> AddRemoveEvent;
+
+               /// <summary>
+               /// A EventHandler handles skip update event
+               /// </summary>
+               public event EventHandler<Event> SkipUpdateEvent;
+
+               /// <summary>
+               /// A event argument class for app screen update notification.
+               /// </summary>
+               public class Event : EventArgs
+               {
+                       public string AppId;
+                       public string InstanceId;
+                       public string Info;
+               }
+
+               /// <summary>
+               /// A method for writing debug log
+               /// </summary>
+               /// <param name="message">A log message</param>
+               /// <param name="file">A path of caller file</param>
+               /// <param name="func">A name of caller function</param>
+               /// <param name="line">A line number of caller line</param>
+               private void WriteLog(string message, [CallerFilePath] string file = "", [CallerMemberName] string func = "", [CallerLineNumber] int line = 0)
+               {
+                       Log.Debug("sniper", message);
+               }
+
+               /// <summary>
+               /// A method for handling launched application
+               /// </summary>
+               /// <param name="appId">An ID of launched application</param>
+               /// <param name="instanceId">An instance ID of launched application</param>
+               private void AddedCallback(string appId, string instanceId)
+               {
+                       EventHandler<Event> handler = AddRemoveEvent;
+                       Event eventInfo;
+
+                       WriteLog("Added " + appId + " " + instanceId);
+
+                       if (handler == null)
+                       {
+                               return;
+                       }
+
+                       try
+                       {
+                               eventInfo = new Event();
+                       }
+                       catch (Exception e)
+                       {
+                               WriteLog("Updated Exception : " + e.Message);
+                               return;
+                       }
+
+                       eventInfo.AppId = appId;
+                       eventInfo.InstanceId = instanceId;
+                       eventInfo.Info = "Added";
+
+                       handler(this, eventInfo);
+               }
+
+               /// <summary>
+               /// A method for handling terminated application
+               /// </summary>
+               /// <param name="appId">An ID of terminated application</param>
+               /// <param name="instanceId">An instance ID of terminated application</param>
+               private void RemovedCallback(string appId, string instanceId)
+               {
+                       EventHandler<Event> handler = AddRemoveEvent;
+                       Event eventInfo;
+
+                       WriteLog("Removed " + appId + " " + instanceId);
+
+                       if (handler == null)
+                       {
+                               return;
+                       }
+
+                       try
+                       {
+                               eventInfo = new Event();
+                       }
+                       catch (Exception e)
+                       {
+                               WriteLog("Updated Exception : " + e.Message);
+                               return;
+                       }
+
+                       eventInfo.AppId = appId;
+                       eventInfo.InstanceId = instanceId;
+                       eventInfo.Info = "Removed";
+
+                       handler(this, eventInfo);
+               }
+
+               /// <summary>
+               /// A method for handling application screen is updated
+               /// </summary>
+               /// <param name="appId">An ID of application that screen is updated</param>
+               /// <param name="instanceId">An instance ID of application that screen is updated</param>
+               /// <param name="Filename">A path of application screen shot</param>
+               private void UpdatedCallback(string appId, string instanceId, string Filename)
+               {
+                       EventHandler<Event> handler = UpdatedEvent;
+                       Event eventInfo;
+
+                       WriteLog("Updated " + appId + " " + instanceId + " " + Filename);
+
+                       if (handler == null)
+                       {
+                               return;
+                       }
+
+                       try
+                       {
+                               eventInfo = new Event();
+                       }
+                       catch (Exception e)
+                       {
+                               WriteLog("Updated Exception : " + e.Message);
+                               return;
+                       }
+
+                       eventInfo.Info = Filename;
+                       eventInfo.AppId = appId;
+                       eventInfo.InstanceId = instanceId;
+
+                       handler(this, eventInfo);
+               }
+
+               /// <summary>
+               /// A method for handling screen update is skipped
+               /// </summary>
+               /// <param name="appId">An ID of application that screen update is skipped</param>
+               /// <param name="instanceId">An instance ID of application that screen update is skipped</param>
+               /// <param name="Filename">A path of application screen shot</param>
+               /// <returns>Returns finish code</returns>
+               private int SkipUpdateCallback(string appId, string instanceId, string Filename)
+               {
+                       EventHandler<Event> handler = SkipUpdateEvent;
+                       Event eventInfo;
+
+                       WriteLog("SkipUpdate" + appId + " " + instanceId + " " + Filename);
+
+                       if (handler == null)
+                       {
+                               return 0;
+                       }
+
+                       try
+                       {
+                               eventInfo = new Event();
+                       }
+                       catch (Exception e)
+                       {
+                               WriteLog("SkipUpdated Exception : " + e.Message);
+                               return 0;
+                       }
+
+                       eventInfo.Info = Filename;
+                       eventInfo.AppId = appId;
+                       eventInfo.InstanceId = instanceId;
+
+                       handler(this, eventInfo);
+
+                       if (SkipUpdateFlag)
+                       {
+                               WriteLog("Update is skipped : " + Filename);
+                               SkipUpdateFlag = false;
+                               return 1;
+                       }
+
+                       return 0;
+               }
+
+               /// <summary>
+               /// Constructor
+               /// </summary>
+               /// <param name="window">Main window of this application</param>
+               /// <param name="path">Storage path</param>
+               /// <param name="width">Screen shot width</param>
+               /// <param name="height">Screen shot height</param>
+               public Sniper(IntPtr window, string path, int width, int height)
+               {
+                       nativeWindow = window;
+                       storagePath = path;
+                       imageWidth = width;
+                       imageHeight = height;
+                       SkipUpdateFlag = false;
+               }
+
+               /// <summary>
+               /// A method for starting monitoring
+               /// Adds callbacks and initialize Sniper class
+               /// </summary>
+               public void StartMonitor()
+               {
+                       try
+                       {
+                               callbacks = new InterOp.SniperCallback();
+                               callbacks.Added = new InterOp.CallbackAddedRemoved(AddedCallback);
+                               callbacks.Removed = new InterOp.CallbackAddedRemoved(RemovedCallback);
+                               callbacks.Updated = new InterOp.CallbackUpdated(UpdatedCallback);
+                               callbacks.SkipUpdate = new InterOp.CallbackSkipUpdate(SkipUpdateCallback);
+                       }
+                       catch (Exception e)
+                       {
+                               throw new SniperException(e.Message);
+                       }
+
+                       try
+                       {
+                               InterOp.sniper_init(nativeWindow, callbacks, storagePath, imageWidth, imageHeight);
+                       }
+                       catch (DllNotFoundException e)
+                       {
+                               WriteLog("Loadable library is not found " + e.StackTrace);
+                       }
+
+                       WriteLog("Sniper starts monitoring : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
+               }
+
+               /// <summary>
+               /// A method stops monitoring
+               /// </summary>
+               public void StopMonitor()
+               {
+                       try
+                       {
+                               InterOp.sniper_fini();
+                       }
+                       catch (DllNotFoundException e)
+                       {
+                               WriteLog("Loadable library is not found " + e.StackTrace);
+                       }
+
+                       WriteLog("Sniper stops monitoring : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
+               }
+
+               /// <summary>
+               /// A method requests updating application screen shot
+               /// </summary>
+               /// <param name="instanceId">An instance ID of application</param>
+               public void RequestUpdate(string instanceId)
+               {
+                       try
+                       {
+                               InterOp.sniper_request_update(instanceId);
+                       }
+                       catch (DllNotFoundException e)
+                       {
+                               WriteLog("Loadable library is not found " + e.StackTrace);
+                       }
+
+                       WriteLog("Sniper requests update (" + instanceId + ") : " + storagePath + "ImageSize : " + imageWidth + "x" + imageHeight);
+               }
+       }
 }
 
 /* End of a file */
index 12712b9..d0bf60a 100644 (file)
@@ -4,7 +4,7 @@ using System.Runtime.InteropServices;
 namespace CoreApp
 {
     /// <summary>
-    /// TODO : Comment this
+    /// Sniper InterOp class for getting application's screen-shot.
     /// </summary>
     internal static partial class InterOp
     {
index 260847a..c13b831 100755 (executable)
@@ -51,7 +51,9 @@
   <ItemGroup>
     <Compile Include="Sniper.cs" />
     <Compile Include="SniperException.cs" />
-    <Compile Include="SniperInterOp.cs" />
+    <Compile Include="SniperInterOp.cs">
+               <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
+       </Compile>
     <Compile Include="TVHome.TizenTV.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
     <Content Include="res\img_tizen_home_list_bg_white_focused.png" />
     <Content Include="res\img_tizen_home_list_bg_white_normal.png" />
     <Content Include="res\img_tizen_home_list_dimmed_recent.png" />
-    <Content Include="res\org.tizen.example.Amazon.Tizen.png" />
-    <Content Include="res\org.tizen.example.Bawee.Tizen.png" />
-    <Content Include="res\org.tizen.example.Be183.Tizen.png" />
-    <Content Include="res\org.tizen.example.Butterfly.Tizen.png" />
-    <Content Include="res\org.tizen.example.Calculator.Tizen.png" />
-    <Content Include="res\org.tizen.example.HomeFitness.Tizen.png" />
-    <Content Include="res\org.tizen.example.Hulu.Tizen.png" />
-    <Content Include="res\org.tizen.example.Mustache.Tizen.png" />
-    <Content Include="res\org.tizen.example.Netflix.Tizen.png" />
-    <Content Include="res\org.tizen.example.Radio.Tizen.png" />
-    <Content Include="res\org.tizen.example.Sports.Tizen.png" />
-    <Content Include="res\org.tizen.example.Switcho.Tizen.png" />
-    <Content Include="res\org.tizen.example.TocToc.Tizen.png" />
-    <Content Include="res\org.tizen.example.Toda.Tizen.png" />
-    <Content Include="res\org.tizen.example.Vimeo.Tizen.png" />
-    <Content Include="res\org.tizen.example.XBox.Tizen.png" />
-    <Content Include="res\org.tizen.example.YouTube.Tizen.png" />
     <Content Include="res\screenshot.png" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
index c577474..a8d042b 100644 (file)
@@ -3,7 +3,7 @@
   <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
     <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
     <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
-    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\git\home\TVHome\TVHome.TizenTV\TVHome.TizenTV.project.lock.json</ProjectAssetsFile>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">D:\_Data\csharp\spin_home\home\TVHome\TVHome.TizenTV\TVHome.TizenTV.project.lock.json</ProjectAssetsFile>
     <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
     <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\samsung\.nuget\packages\</NuGetPackageFolders>
     <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">ProjectJson</NuGetProjectStyle>
@@ -13,6 +13,6 @@
     <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
   </PropertyGroup>
   <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
-    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+    <Import Project="$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('$(NuGetPackageRoot)xamarin.forms\2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   </ImportGroup>
 </Project>
\ No newline at end of file
index e049334..28ae18a 100755 (executable)
@@ -6,11 +6,11 @@
     "preserveCompilationContext": true
   },
   "dependencies": {
-    "ElmSharp": "1.1.0-beta-021",
-    "Microsoft.NETCore.App": "1.1.0",
-    "Tizen.Xamarin.Forms.Extension": "2.3.5-r233-002",
-    "Xamarin.Forms": "2.3.5-r233-003",
-    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-003"
+    "ElmSharp": "1.2.0-beta-001",
+    "Microsoft.NETCore.App": "1.1.2",
+    "Tizen.Xamarin.Forms.Extension": "2.3.5-r233-003",
+    "Xamarin.Forms": "2.3.5-r233-008",
+    "Xamarin.Forms.Platform.Tizen": "2.3.5-r233-008"
   },
   "runtimes": {
     "win": {},
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.Butterfly.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.Butterfly.Tizen.png
deleted file mode 100644 (file)
index 738a625..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.Butterfly.Tizen.png and /dev/null differ
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.Calculator.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.Calculator.Tizen.png
deleted file mode 100644 (file)
index fb15bac..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.Calculator.Tizen.png and /dev/null differ
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.HomeFitness.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.HomeFitness.Tizen.png
deleted file mode 100644 (file)
index 738a625..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.HomeFitness.Tizen.png and /dev/null differ
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.Sports.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.Sports.Tizen.png
deleted file mode 100644 (file)
index fb15bac..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.Sports.Tizen.png and /dev/null differ
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.Toda.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.Toda.Tizen.png
deleted file mode 100644 (file)
index fb15bac..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.Toda.Tizen.png and /dev/null differ
diff --git a/TVHome/TVHome.TizenTV/res/org.tizen.example.YouTube.Tizen.png b/TVHome/TVHome.TizenTV/res/org.tizen.example.YouTube.Tizen.png
deleted file mode 100644 (file)
index 738a625..0000000
Binary files a/TVHome/TVHome.TizenTV/res/org.tizen.example.YouTube.Tizen.png and /dev/null differ
index 337d87c..fa9c891 100755 (executable)
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Tizen.Xamarin.Forms.Extension, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-002\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Tizen.Xamarin.Forms.Extension.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81\Tizen.Xamarin.Forms.Extension.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll</HintPath>
     </Reference>
     <Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-003\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\..\packages\Xamarin.Forms.2.3.5-r233-008\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
-  <Import Project="..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
+  <Import Project="..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
       <ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
     </PropertyGroup>
-    <Error Condition="!Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.2.3.5-r233-003\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
+    <Error Condition="!Exists('..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.2.3.5-r233-008\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets'))" />
   </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
                Other similar extension points exist, see Microsoft.Common.targets.
index 3990937..31be243 100755 (executable)
@@ -68,9 +68,10 @@ namespace TVHome.ViewModels
             {
                 return selectedMenuName;
             }
+
             set
             {
-                if(selectedMenuName != value)
+                if (selectedMenuName != value)
                 {
                     selectedMenuName = value;
                     ChangeSelectedPanelName(value, true);
@@ -241,7 +242,7 @@ namespace TVHome.ViewModels
         }
 
         /// <summary>
-        /// A method for makeing MainMenu items and display in MainPanel
+        /// A method for making MainMenu items and display in MainPanel
         /// </summary>
         private void MakeMainMenuItems()
         {
index 0dc7a5a..e9dfad3 100755 (executable)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-002" targetFramework="portable45-net45+win8+wp8+wpa81" />
-  <package id="Xamarin.Forms" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Tizen.Xamarin.Forms.Extension" version="2.3.5-r233-003" targetFramework="portable45-net45+win8+wp8+wpa81" />
+  <package id="Xamarin.Forms" version="2.3.5-r233-008" targetFramework="portable45-net45+win8+wp8+wpa81" />
 </packages>
\ No newline at end of file
index 3b36328..074519a 100644 (file)
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.12
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TVHome", "TVHome\TVHome\TVHome.csproj", "{54DD6673-7E64-48E6-A008-4D455E19E017}"
 EndProject
@@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibTVRefCommonTizen", "LibT
                {67F9D3A8-F71E-4428-913F-C37AE82CDB24} = {67F9D3A8-F71E-4428-913F-C37AE82CDB24}
        EndProjectSection
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HomeUnitTest", "HomeUnitTest\HomeUnitTest.csproj", "{1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}"
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Debug|Any CPU = Debug|Any CPU
@@ -51,6 +53,10 @@ Global
                {C558D279-897E-45E1-A10A-DECD788770F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {C558D279-897E-45E1-A10A-DECD788770F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {C558D279-897E-45E1-A10A-DECD788770F4}.Release|Any CPU.Build.0 = Release|Any CPU
+               {1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {1F2DB8A0-7D1E-4BA3-BF27-335D033C572C}.Release|Any CPU.Build.0 = Release|Any CPU
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE