diff --git a/Assets/Resources/OVRBuildConfig.asset b/Assets/Resources/OVRBuildConfig.asset index f2d36f8..cf5cd6c 100644 --- a/Assets/Resources/OVRBuildConfig.asset +++ b/Assets/Resources/OVRBuildConfig.asset @@ -12,6 +12,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 20553fac56ec59645857c0732b787431, type: 3} m_Name: OVRBuildConfig m_EditorClassIdentifier: - androidSDKPath: C:\Users\tvero\AppData\Local\Android\Sdk + androidSDKPath: gradlePath: jdkPath: diff --git a/Assets/Scenes/QuestAppLauncher.unity b/Assets/Scenes/QuestAppLauncher.unity index 8dc72db..f285b6a 100644 --- a/Assets/Scenes/QuestAppLauncher.unity +++ b/Assets/Scenes/QuestAppLauncher.unity @@ -120,6 +120,163 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &9238413 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9238414} + - component: {fileID: 9238416} + - component: {fileID: 9238415} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9238414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9238413} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1228372841} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 500, y: -75} + m_SizeDelta: {x: 400, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &9238415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9238413} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_text: Only Show What's In Appnames.txt + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_outlineColor: + serializedVersion: 2 + rgba: 4278190080 + m_fontSize: 86 + m_fontSizeBase: 86 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 86 + m_fontStyle: 0 + m_textAlignment: 513 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_firstOverflowCharacterIndex: -1 + m_linkedTextComponent: {fileID: 0} + m_isLinkedTextComponent: 0 + m_isTextTruncated: 0 + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_ignoreRectMaskCulling: 0 + m_ignoreCulling: 1 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_VertexBufferAutoSizeReduction: 1 + m_firstVisibleCharacter: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_textInfo: + textComponent: {fileID: 9238415} + characterCount: 32 + spriteCount: 0 + spaceCount: 4 + wordCount: 6 + linkCount: 0 + lineCount: 1 + pageCount: 1 + materialCount: 1 + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_spriteAnimator: {fileID: 0} + m_hasFontAssetChanged: 0 + m_subTextObjects: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &9238416 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9238413} + m_CullTransparentMesh: 0 --- !u!1 &61603938 GameObject: m_ObjectHideFlags: 0 @@ -243,9 +400,9 @@ RectTransform: m_Father: {fileID: 103848540} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &84052785 @@ -305,7 +462,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 514 + m_textAlignment: 513 m_characterSpacing: 0 m_wordSpacing: 0 m_lineSpacing: 0 @@ -402,9 +559,9 @@ RectTransform: m_Father: {fileID: 302656573} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 500, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &87081340 @@ -562,9 +719,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 1300, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &103848541 @@ -585,7 +742,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 0 + m_Spacing: 50 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 0 @@ -603,7 +760,7 @@ BoxCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Size: {x: 800, y: 150, z: 0.05} + m_Size: {x: 600, y: 150, z: 0.05} m_Center: {x: 0, y: 0, z: 0} --- !u!114 &103848543 MonoBehaviour: @@ -929,9 +1086,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 600, y: -525} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &302656574 @@ -1156,6 +1313,81 @@ RectTransform: m_AnchoredPosition: {x: -5, y: 0} m_SizeDelta: {x: -20, y: 0} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &393212879 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393212880} + - component: {fileID: 393212882} + - component: {fileID: 393212881} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393212880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393212879} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1315200143} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 150, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &393212881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393212879} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &393212882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393212879} + m_CullTransparentMesh: 0 --- !u!1 &431655836 GameObject: m_ObjectHideFlags: 0 @@ -1259,9 +1491,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 700, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &455930356 @@ -1282,7 +1514,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 0 + m_Spacing: 50 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 0 @@ -1300,7 +1532,7 @@ BoxCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Size: {x: 800, y: 150, z: 0.05} + m_Size: {x: 600, y: 150, z: 0.05} m_Center: {x: 0, y: 0, z: 0} --- !u!114 &455930358 MonoBehaviour: @@ -1384,9 +1616,9 @@ RectTransform: m_Father: {fileID: 455930355} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 100, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 200, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &470013057 @@ -1495,9 +1727,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 1625, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &604462433 @@ -1935,9 +2167,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 200, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!65 &715250741 @@ -2055,7 +2287,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 10, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -2130,7 +2362,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -2212,6 +2444,7 @@ RectTransform: m_Children: - {fileID: 1133097218} - {fileID: 302656573} + - {fileID: 1228372841} - {fileID: 949458750} - {fileID: 1106898771} m_Father: {fileID: 1213035640} @@ -2355,9 +2588,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 200, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &907338449 @@ -2588,11 +2821,11 @@ RectTransform: - {fileID: 1398590894} - {fileID: 604462432} m_Father: {fileID: 883330324} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 600, y: -775} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &949458751 @@ -2729,9 +2962,9 @@ RectTransform: m_Father: {fileID: 302656573} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 100, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 200, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &987583756 @@ -2956,11 +3189,11 @@ RectTransform: m_Children: - {fileID: 2009369172} m_Father: {fileID: 883330324} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 600, y: -1025} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1106898772 @@ -3127,9 +3360,9 @@ RectTransform: m_Father: {fileID: 455930355} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1107460993 @@ -3187,7 +3420,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 514 + m_textAlignment: 513 m_characterSpacing: 0 m_wordSpacing: 0 m_lineSpacing: 0 @@ -3552,9 +3785,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -275} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1133097219 @@ -3627,9 +3860,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 675, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1170891612 @@ -3848,7 +4081,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1213035640 RectTransform: m_ObjectHideFlags: 0 @@ -3870,6 +4103,133 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 2802, y: 2000} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1228372840 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1228372841} + - component: {fileID: 1228372844} + - component: {fileID: 1228372843} + - component: {fileID: 1228372842} + m_Layer: 5 + m_Name: AppNames_Only + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1228372841 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228372840} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1315200143} + - {fileID: 9238414} + m_Father: {fileID: 883330324} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 600, y: -775} + m_SizeDelta: {x: 800, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1228372842 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228372840} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 +--- !u!65 &1228372843 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228372840} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 800, y: 150, z: 0.05} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &1228372844 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228372840} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1315200144} + toggleTransition: 1 + graphic: {fileID: 393212881} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null + m_IsOn: 1 --- !u!1 &1251844110 GameObject: m_ObjectHideFlags: 0 @@ -4036,6 +4396,82 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1315200142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1315200143} + - component: {fileID: 1315200145} + - component: {fileID: 1315200144} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1315200143 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1315200142} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 393212880} + m_Father: {fileID: 1228372841} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 100, y: -75} + m_SizeDelta: {x: 200, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1315200144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1315200142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.24313727, g: 0.427451, b: 0.6627451, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1315200145 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1315200142} + m_CullTransparentMesh: 0 --- !u!1 &1349177899 GameObject: m_ObjectHideFlags: 0 @@ -4071,9 +4507,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 1900, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1349177901 @@ -4094,7 +4530,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 0 + m_Spacing: 50 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 0 @@ -4112,7 +4548,7 @@ BoxCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Size: {x: 800, y: 150, z: 0.05} + m_Size: {x: 600, y: 150, z: 0.05} m_Center: {x: 0, y: 0, z: 0} --- !u!114 &1349177903 MonoBehaviour: @@ -4198,9 +4634,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 1150, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!65 &1398590895 @@ -4393,9 +4829,9 @@ RectTransform: m_Father: {fileID: 103848540} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 100, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 200, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1802350636 @@ -4864,7 +5300,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -5086,9 +5522,9 @@ RectTransform: m_Father: {fileID: 1106898771} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2009369173 @@ -5479,7 +5915,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 10, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -5554,9 +5990,9 @@ RectTransform: m_Father: {fileID: 1349177900} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 100, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 200, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2079963552 @@ -5629,9 +6065,9 @@ RectTransform: m_Father: {fileID: 1349177900} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -75} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2096913252 @@ -5689,7 +6125,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 514 + m_textAlignment: 513 m_characterSpacing: 0 m_wordSpacing: 0 m_lineSpacing: 0 diff --git a/Assets/Scripts/GridPopulation.cs b/Assets/Scripts/GridPopulation.cs index 8bbb9b5..16bd857 100644 --- a/Assets/Scripts/GridPopulation.cs +++ b/Assets/Scripts/GridPopulation.cs @@ -16,6 +16,15 @@ namespace QuestAppLauncher /// public class GridPopulation : MonoBehaviour { + class ProcessedApp + { + public int Index; + public string PackageName; + public string AppName; + public string Tab1Name; + public string Tab2Name; + } + // File name of app name overrides const string AppNameOverrideFile = "appnames.txt"; @@ -207,24 +216,8 @@ namespace QuestAppLauncher using (AndroidJavaObject currentActivity = unity.GetStatic("currentActivity")) { // Dictionary to hold package name -> app index, app name - var packageNameToAppName = new Dictionary(); + var apps = new Dictionary(); var excludedPackageNames = new HashSet(); - var tabList = new List(); - var isNoneTab = false; - - if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) - { - // If no categories, just create a placeholder tab - tabList.Add(Tab_None); - isNoneTab = true; - } - else - { - // Create built-in categories - tabList.Add(Tab_Quest); - tabList.Add(Tab_Go); - tabList.Add(Tab_2D); - } // Get # of installed apps int numApps = currentActivity.Call("getSize"); @@ -261,13 +254,9 @@ namespace QuestAppLauncher continue; } - // Determine app type (None, Quest, Go or 2D) + // Determine app type (Quest, Go or 2D) string tabName; - if (isNoneTab) - { - tabName = Tab_None; - } - else if (currentActivity.Call("is2DApp", i)) + if (currentActivity.Call("is2DApp", i)) { if (!config.show2D) { @@ -287,26 +276,67 @@ namespace QuestAppLauncher tabName = Tab_Go; } - packageNameToAppName.Add(packageName, (i, tabName, appName)); + apps.Add(packageName, new ProcessedApp { PackageName = packageName, Index = i, Tab1Name = tabName, AppName = appName }); Debug.LogFormat("[{0}] package: {1}, name: {2}, tab: {3}", i, packageName, appName, tabName); yield return null; } // Override app names, if any - // This is just a file with comma-separated packageName,appName pairs + // This is just a file with comma-separated packageName,appName[,category1[, category2]] + // Category1 and category2 are optional categories (tabs). var appNameOverrideFilePath = Path.Combine(persistentDataPath, AppNameOverrideFile); if (File.Exists(appNameOverrideFilePath)) { Debug.Log("Found file: " + appNameOverrideFilePath); - string[] overriddenNames = File.ReadAllLines(appNameOverrideFilePath); - foreach (string overriddenName in overriddenNames) + string[] lines = File.ReadAllLines(appNameOverrideFilePath); + foreach (string line in lines) { - var entry = overriddenName.Split(','); - if (2 == entry.Length && packageNameToAppName.ContainsKey(entry[0])) + line.Trim(); + + if (line.StartsWith("#")) { - packageNameToAppName[entry[0]] = (packageNameToAppName[entry[0]].Index, - packageNameToAppName[entry[0]].TabName, entry[1]); + // Skip comments + continue; } + + // Parse line + var entry = line.Split(','); + if (entry.Length < 2) + { + // We expect at least two entries + continue; + } + + var packageName = entry[0]; + var appName = entry[1]; + var tab1 = entry.Length > 2 ? entry[2] : null; + var tab2 = entry.Length > 3 ? entry[3] : null; + + if (tab1 != null && tab1.Length == 0) + { + tab1 = null; + } + + if (tab2 != null && tab2.Length == 0) + { + tab2 = null; + } + + if (!apps.ContainsKey(packageName)) + { + // App is not installed, so skip + continue; + } + + // Update entry + apps[packageName] = new ProcessedApp + { + PackageName = apps[entry[0]].PackageName, + Index = apps[entry[0]].Index, + AppName = appName, + Tab1Name = tab1 ?? apps[entry[0]].Tab1Name, + Tab2Name = tab2 + }; } } else @@ -325,7 +355,7 @@ namespace QuestAppLauncher foreach (var iconFileName in Directory.GetFiles(iconOverridePath, IconOverrideExtSearch)) { var entry = Path.GetFileNameWithoutExtension(iconFileName); - if (packageNameToAppName.ContainsKey(entry)) + if (apps.ContainsKey(entry)) { Debug.Log("Found file: " + iconFileName); iconOverrides[entry] = Path.Combine(iconOverridePath, iconFileName); @@ -338,15 +368,14 @@ namespace QuestAppLauncher yield return null; // Populate the panel content - yield return PopulatePanelContent(currentActivity, config, tabList, packageNameToAppName, iconOverrides); + yield return PopulatePanelContent(currentActivity, config, apps, iconOverrides); } } private IEnumerator PopulatePanelContent( AndroidJavaObject currentActivity, Config config, - List tabList, - Dictionary apps, + Dictionary apps, Dictionary iconOverrides) { // Destroy existing scrollviews and tabs @@ -356,11 +385,49 @@ namespace QuestAppLauncher Destroy(this.scrollContainer.transform.GetChild(i).gameObject); } - var gridContents = new Dictionary(); + List tabs; + bool isNoneTab = false; + + if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) + { + // No tabs - use special "None" tab + tabs = new List(); + tabs.Add(Tab_None); + isNoneTab = true; + } + else if (config.categoryType.Equals(Config.Category_Auto, StringComparison.OrdinalIgnoreCase)) + { + // Add built-in tabs + tabs = new List(); + tabs.Add(Tab_Quest); + tabs.Add(Tab_Go); + tabs.Add(Tab_2D); + } + else + { + // Construct list of custom tabs, sorted alphabetically and add built-in tabs up front + tabs = apps.Select(x => x.Value.Tab1Name).Union( + apps.Where(x => null != x.Value.Tab2Name).Select(x => x.Value.Tab2Name)).Distinct().ToList(); + tabs.Sort(); + if (tabs.Remove(Tab_2D)) + { + tabs.Insert(0, Tab_2D); + } + if (tabs.Remove(Tab_Go)) + { + tabs.Insert(0, Tab_Go); + } + if (tabs.Remove(Tab_Quest)) + { + tabs.Insert(0, Tab_Quest); + } + } + + var gridContents = new Dictionary(); bool isFirstTab = true; // Create scroll views and tabs - foreach (string tabName in tabList) + foreach (string tabName in tabs) { Debug.LogFormat("Populating tab '{0}'", tabName); @@ -385,87 +452,91 @@ namespace QuestAppLauncher toggle.group = this.tabContainer.GetComponent(); toggle.onValueChanged.AddListener(scrollView.SetActive); - if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) + if (isNoneTab) { // Hide the special "None" tab tab.SetActive(false); } - // Record the grid content - gridContents[tabName] = (scrollView.GetComponent().content.gameObject, - scrollView, tab, false); isFirstTab = false; + + // Record the grid content + gridContents[tabName] = scrollView.GetComponent().content.gameObject; } // Populate grid with app information (name & icon) // Sort by app name foreach (var app in apps.OrderBy(key => key.Value.AppName)) { - // Create new instances of our app info prefabCell - var gridContent = gridContents[app.Value.TabName].gridContent; - var newObj = (GameObject)Instantiate(this.prefabCell, gridContent.transform); - - // Mark that this grid content is in use - gridContents[app.Value.TabName] = (gridContent, gridContents[app.Value.TabName].scrollView, - gridContents[app.Value.TabName].tab, true); - - // Set app entry info - var appEntry = newObj.GetComponent("AppEntry") as AppEntry; - appEntry.packageId = app.Key; - appEntry.appName = app.Value.AppName; - - // Get app icon - byte[] bytesIcon = null; - bool useApkIcon = true; - if (iconOverrides.ContainsKey(app.Key)) + if (isNoneTab) { - // Use overridden icon - try + // No tabs, so use the special "None" tab + yield return AddCellToGrid(app.Value, gridContents[Tab_None].transform, iconOverrides, currentActivity); + } + else + { + // Add to tab1 + yield return AddCellToGrid(app.Value, gridContents[app.Value.Tab1Name].transform, iconOverrides, currentActivity); + + if (null != app.Value.Tab2Name) { - bytesIcon = File.ReadAllBytes(iconOverrides[app.Key]); - useApkIcon = false; - } - catch (Exception e) - { - // Fall back to using the apk icon - Debug.Log(string.Format("Error reading app icon from file [{0}]: {1}", iconOverrides[app.Key], e.Message)); + // Tab2 exists, so add to tab2 + yield return AddCellToGrid(app.Value, gridContents[app.Value.Tab2Name].transform, iconOverrides, currentActivity); } } - - if (useApkIcon) - { - // Use built-in icon from the apk - bytesIcon = (byte[])(Array)currentActivity.Call("getIcon", app.Value.Index); - } - - // Set the icon image - var image = newObj.transform.Find("AppIcon").GetComponentInChildren(); - var texture = new Texture2D(2, 2, TextureFormat.RGB24, false); - texture.filterMode = FilterMode.Trilinear; - texture.anisoLevel = 16; - texture.LoadImage(bytesIcon); - var rect = new Rect(0, 0, texture.width, texture.height); - image.sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); - - // Set app name in text - var text = newObj.transform.Find("AppName").GetComponentInChildren(); - text.text = app.Value.AppName; - - yield return null; } + } - // Remove any empty scroll views and tabs - foreach (string tabName in tabList) + private IEnumerator AddCellToGrid(ProcessedApp app, Transform transform, + Dictionary iconOverrides, + AndroidJavaObject currentActivity) + { + // Create new instances of our app info prefabCell + var newObj = (GameObject)Instantiate(this.prefabCell, transform); + + // Set app entry info + var appEntry = newObj.GetComponent("AppEntry") as AppEntry; + appEntry.packageId = app.PackageName; + appEntry.appName = app.AppName; + + // Get app icon + byte[] bytesIcon = null; + bool useApkIcon = true; + if (iconOverrides.ContainsKey(app.PackageName)) { - if (gridContents[tabName].isInUse) + // Use overridden icon + try { - continue; + bytesIcon = File.ReadAllBytes(iconOverrides[app.PackageName]); + useApkIcon = false; + } + catch (Exception e) + { + // Fall back to using the apk icon + Debug.Log(string.Format("Error reading app icon from file [{0}]: {1}", iconOverrides[app.PackageName], e.Message)); } - - Debug.LogFormat("Removing empty tab '{0}'", tabName); - Destroy(gridContents[tabName].scrollView); - Destroy(gridContents[tabName].tab); } + + if (useApkIcon) + { + // Use built-in icon from the apk + bytesIcon = (byte[])(Array)currentActivity.Call("getIcon", app.Index); + } + + // Set the icon image + var image = newObj.transform.Find("AppIcon").GetComponentInChildren(); + var texture = new Texture2D(2, 2, TextureFormat.RGB24, false); + texture.filterMode = FilterMode.Trilinear; + texture.anisoLevel = 16; + texture.LoadImage(bytesIcon); + var rect = new Rect(0, 0, texture.width, texture.height); + image.sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); + + // Set app name in text + var text = newObj.transform.Find("AppName").GetComponentInChildren(); + text.text = app.AppName; + + yield return null; } } #endregion