From a5c987acefe7f3cbd89857e7f196f79852e9c538 Mon Sep 17 00:00:00 2001 From: tverona1 Date: Sun, 28 Jul 2019 00:23:09 -0700 Subject: [PATCH] Added support for "showOnlyCustom" Added support for "showOnlyCustom": Only shows apps specified in appnames.txt. --- Assets/Scenes/QuestAppLauncher.unity | 141 ++++++++++++++------------- Assets/Scripts/Config.cs | 13 ++- Assets/Scripts/GridPopulation.cs | 32 +++++- Assets/Scripts/ScrollRectOverride.cs | 1 - Assets/Scripts/SettingsHandler.cs | 27 ++++- README.md | 45 ++++++++- 6 files changed, 178 insertions(+), 81 deletions(-) diff --git a/Assets/Scenes/QuestAppLauncher.unity b/Assets/Scenes/QuestAppLauncher.unity index f285b6a..d827e9f 100644 --- a/Assets/Scenes/QuestAppLauncher.unity +++ b/Assets/Scenes/QuestAppLauncher.unity @@ -400,9 +400,9 @@ RectTransform: m_Father: {fileID: 103848540} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 450, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &84052785 @@ -559,9 +559,9 @@ RectTransform: m_Father: {fileID: 302656573} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 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 &87081340 @@ -719,9 +719,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1300, y: -75} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &103848541 @@ -1086,9 +1086,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 600, y: -525} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &302656574 @@ -1491,9 +1491,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 700, y: -75} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &455930356 @@ -1616,9 +1616,9 @@ RectTransform: m_Father: {fileID: 455930355} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 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 &470013057 @@ -1727,9 +1727,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1625, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &604462433 @@ -2167,9 +2167,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 200, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!65 &715250741 @@ -2287,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: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 10, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -2362,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: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -2540,6 +2540,7 @@ MonoBehaviour: gridRowsText: {fileID: 604462431} gridPopulation: {fileID: 1860838374} show2DToggle: {fileID: 302656572} + showOnlyCustomToggle: {fileID: 1228372840} tabsNone: {fileID: 455930358} tabsAuto: {fileID: 103848543} tabsCustom: {fileID: 1349177903} @@ -2588,9 +2589,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 200, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &907338449 @@ -2823,9 +2824,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 600, y: -1025} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &949458751 @@ -2962,9 +2963,9 @@ RectTransform: m_Father: {fileID: 302656573} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 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 &987583756 @@ -3191,9 +3192,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 600, y: -1275} m_SizeDelta: {x: 800, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1106898772 @@ -3360,9 +3361,9 @@ RectTransform: m_Father: {fileID: 455930355} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 450, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1107460993 @@ -3785,9 +3786,9 @@ RectTransform: m_Father: {fileID: 883330324} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 400, y: -275} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1133097219 @@ -3860,9 +3861,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 675, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1170891612 @@ -4081,7 +4082,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1213035640 RectTransform: m_ObjectHideFlags: 0 @@ -4116,12 +4117,12 @@ GameObject: - component: {fileID: 1228372843} - component: {fileID: 1228372842} m_Layer: 5 - m_Name: AppNames_Only + m_Name: Show_Only_Custom m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1228372841 RectTransform: m_ObjectHideFlags: 0 @@ -4507,9 +4508,9 @@ RectTransform: m_Father: {fileID: 1133097218} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1900, y: -75} m_SizeDelta: {x: 600, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1349177901 @@ -4634,9 +4635,9 @@ RectTransform: m_Father: {fileID: 949458750} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1150, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!65 &1398590895 @@ -4829,9 +4830,9 @@ RectTransform: m_Father: {fileID: 103848540} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 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 &1802350636 @@ -5300,7 +5301,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -5522,9 +5523,9 @@ RectTransform: m_Father: {fileID: 1106898771} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 400, y: -75} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2009369173 @@ -5915,7 +5916,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 10, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -5990,9 +5991,9 @@ RectTransform: m_Father: {fileID: 1349177900} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 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 &2079963552 @@ -6065,9 +6066,9 @@ RectTransform: m_Father: {fileID: 1349177900} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 450, y: -75} m_SizeDelta: {x: 400, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2096913252 diff --git a/Assets/Scripts/Config.cs b/Assets/Scripts/Config.cs index 85de797..c516559 100644 --- a/Assets/Scripts/Config.cs +++ b/Assets/Scripts/Config.cs @@ -27,10 +27,21 @@ namespace QuestAppLauncher public int cols = 3; } + // Grid size, specified as cols x rows public GridSize gridSize = new GridSize(); + + // Whether to show 2D apps public bool show2D = false; - // Category types: "none", "automatic", "custom" + // Whether to only show apps that are explicitly specified in appnames.txt file. + // If true, this will not show installed apps that are not in appnames.txt. This + // is useful for organizing the launcher with a highly curated list of apps. + public bool showOnlyCustom = false; + + // Category types: "none", "auto", "custom": + // - none: No categories - all apps are listed in a single pane + // - auto: Apps are automatically categorized into 3 tabs - Quest, Go/GearVr, 2D + // - custom: Apps are categorized according to appnames.txt file public string categoryType = Category_Auto; } diff --git a/Assets/Scripts/GridPopulation.cs b/Assets/Scripts/GridPopulation.cs index 16bd857..0272cb4 100644 --- a/Assets/Scripts/GridPopulation.cs +++ b/Assets/Scripts/GridPopulation.cs @@ -21,8 +21,10 @@ namespace QuestAppLauncher public int Index; public string PackageName; public string AppName; + public string AutoTabName; public string Tab1Name; public string Tab2Name; + public bool IsOverride; } // File name of app name overrides @@ -138,16 +140,19 @@ namespace QuestAppLauncher /// /// Static method to delete the excludedFile /// - /// - static public void DeleteExcludedApksFile() + /// true if file exists + static public bool DeleteExcludedAppsFile() { var persistentDataPath = UnityEngine.Application.persistentDataPath; var excludedPackageNamesFilePath = Path.Combine(persistentDataPath, ExcludedPackagesFile); if (File.Exists(excludedPackageNamesFilePath)) + { File.Delete(excludedPackageNamesFilePath); + return true; + } - SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); + return false; } public void SetGridSize(GameObject gridContent, int rows, int cols) @@ -276,7 +281,7 @@ namespace QuestAppLauncher tabName = Tab_Go; } - apps.Add(packageName, new ProcessedApp { PackageName = packageName, Index = i, Tab1Name = tabName, AppName = appName }); + apps.Add(packageName, new ProcessedApp { PackageName = packageName, Index = i, AutoTabName = tabName, Tab1Name = tabName, AppName = appName }); Debug.LogFormat("[{0}] package: {1}, name: {2}, tab: {3}", i, packageName, appName, tabName); yield return null; } @@ -334,8 +339,10 @@ namespace QuestAppLauncher PackageName = apps[entry[0]].PackageName, Index = apps[entry[0]].Index, AppName = appName, + AutoTabName = apps[entry[0]].AutoTabName, Tab1Name = tab1 ?? apps[entry[0]].Tab1Name, - Tab2Name = tab2 + Tab2Name = tab2, + IsOverride = true }; } } @@ -387,6 +394,7 @@ namespace QuestAppLauncher List tabs; bool isNoneTab = false; + bool isAutoTab = false; if (config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) { @@ -402,6 +410,7 @@ namespace QuestAppLauncher tabs.Add(Tab_Quest); tabs.Add(Tab_Go); tabs.Add(Tab_2D); + isAutoTab = true; } else { @@ -468,11 +477,24 @@ namespace QuestAppLauncher // Sort by app name foreach (var app in apps.OrderBy(key => key.Value.AppName)) { + if (config.showOnlyCustom && !app.Value.IsOverride) + { + // Since showOnlyCustom is set, skip apps that are not in the appnames.txt file + Debug.LogFormat("Skipping non-Show Only Custom [{0}] Package: {1}, name: {2}", + app.Value.Index, app.Value.PackageName, app.Value.AppName); + continue; + } + if (isNoneTab) { // No tabs, so use the special "None" tab yield return AddCellToGrid(app.Value, gridContents[Tab_None].transform, iconOverrides, currentActivity); } + else if (isAutoTab) + { + // Add to auto (built-in) tabs + yield return AddCellToGrid(app.Value, gridContents[app.Value.AutoTabName].transform, iconOverrides, currentActivity); + } else { // Add to tab1 diff --git a/Assets/Scripts/ScrollRectOverride.cs b/Assets/Scripts/ScrollRectOverride.cs index a7f72c7..667b760 100644 --- a/Assets/Scripts/ScrollRectOverride.cs +++ b/Assets/Scripts/ScrollRectOverride.cs @@ -64,7 +64,6 @@ namespace QuestAppLauncher else if (isInBounds) { // We are outside the scroll view and were previously inside, so disable box colliders on children. - Debug.Log("ScrollRectOverride: Disabling box colliders on children"); foreach (var boxCollider in this.content.gameObject.GetComponentsInChildren()) { boxCollider.enabled = false; diff --git a/Assets/Scripts/SettingsHandler.cs b/Assets/Scripts/SettingsHandler.cs index 65796f3..d1b67d7 100644 --- a/Assets/Scripts/SettingsHandler.cs +++ b/Assets/Scripts/SettingsHandler.cs @@ -20,11 +20,14 @@ namespace QuestAppLauncher public GameObject gridRowsText; public GameObject gridPopulation; public GameObject show2DToggle; + public GameObject showOnlyCustomToggle; public Toggle tabsNone; public Toggle tabsAuto; public Toggle tabsCustom; + private bool deletedHiddenAppsFile = false; + private Config config = new Config(); public void OpenSettings() @@ -53,6 +56,9 @@ namespace QuestAppLauncher // Set 2D toggle this.show2DToggle.GetComponent().SetIsOnWithoutNotify(this.config.show2D); + // Set ShowOnlyCustom toggle + this.showOnlyCustomToggle.GetComponent().SetIsOnWithoutNotify(this.config.showOnlyCustom); + // Set tab mode if (this.config.categoryType.Equals(Config.Category_None, StringComparison.OrdinalIgnoreCase)) { @@ -82,8 +88,12 @@ namespace QuestAppLauncher public void DeleteExcludedApksFile() { - Debug.Log("Delete Excluded Apk List"); - QuestAppLauncher.GridPopulation.DeleteExcludedApksFile(); + Debug.Log("Delete Excluded App List"); + + if (!this.deletedHiddenAppsFile) + { + this.deletedHiddenAppsFile = QuestAppLauncher.GridPopulation.DeleteExcludedAppsFile(); + } } public void UpdateGridColText() @@ -124,6 +134,14 @@ namespace QuestAppLauncher saveConfig = true; } + // Update ShowOnlyCustom toggle + var showOnlyCustom = this.showOnlyCustomToggle.GetComponent().isOn; + if (showOnlyCustom != this.config.showOnlyCustom) + { + this.config.showOnlyCustom = showOnlyCustom; + saveConfig = true; + } + // Update tabbing string tabMode; if (this.tabsNone.isOn) @@ -150,8 +168,11 @@ namespace QuestAppLauncher if (saveConfig) { ConfigPersistence.SaveConfig(this.config); + } - // Re-populate grid + // If we touched the config file or we deleted the hidden apps file, re-populate the grid + if (saveConfig || deletedHiddenAppsFile) + { Debug.Log("Re-populating panel"); this.gridPopulation.GetComponent().StartPopulate(); } diff --git a/README.md b/README.md index 0eeb30b..c4a263b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ An app launcher for Quest implemented in Unity. ## Overriding app icons and names -For each installed app, we extract the default app name (PackageManager.getApplicationLabel()) and default app icon (PackageManager.getApplicationIcon()). Sometimes, however, these do not map to the actual app name and icon in the Oculus Store. In order to override this, do the following: +By default, the launcher uses the default app name and icon (from the apk). Sometimes, however, it is desirable to override these - for example, the icon may be the default Oculus icon instead of the actual game icon; or the app name may these do not map to the actual app name and icon in the Oculus Store. ### Override app names Create a file called **appnames.txt**. Add a line per app with comma-separated package-id and desired name. Example: @@ -24,6 +24,13 @@ Copy these files to the following location on your Quest: Android/data/aaa.Quest The app can be customized by creating a **config.json** file and copying it to the following location on your Quest: Android/data/aaa.QuestAppLauncher.App/files. The following options are supported: +### Categories (tabs) +By default, the launcher will display 3 tabs - Quest, Go/GrearVr and 2D. This can be overridden by specifying the field "categoryType" with one of the following values: + +"none": No categories - all apps are listed in a single pane +"auto": Apps are automatically categorized into 3 tabs - Quest, Go/GearVr, 2D +"custom": Apps are categorized according to appnames.txt file - see below + ### Setting Grid Size The default grid size is 3x3 cells. The grid size can be customized by specifying grid rows and columns as in the following example: @@ -36,6 +43,42 @@ The default grid size is 3x3 cells. The grid size can be customized by specifyin } ``` +### Showing / Hiding 2D apps +To show or hide 2D apps, set the "show2D" field to true or false + +### Only showing apps specified in appnames.txt +By default, the launcher will show all installed apps. Use this "showOnlyCustom" option to exclude any apps that are not specified appnames.txt. This is useful for organizing the launcher with a highly curated list of apps. + +### Example config.json +Here's an example config.json: + +``` +{ + "gridSize": { + "rows": 3, + "cols": 4 + }, + "show2D": true, + "showOnlyCustom": false, + "categoryType": "custom" +} +``` + +## Appnames.txt syntax +This section describes the syntax for appnames.txt entries + +### Custom Categories (Tabs) +As described above, the launcher supports custom categories (tabs). This can be specified in the **appnames.txt** file by adding up to two custom categories per entry. The syntax is: +packageName,appName[,category1[, category2]] + +For example, this will categorize the two entries below in Action and Puzzle tabs: + +com.mycompany.myapp,My Application,Action +com.othercompany.otherapp,Other application,Puzzle + +### Comments +Comments can be added to appnames.txt by prepending "#". + ## Source structure: - Assets/Scenes/QuestAppLauncher.unity: The main scene - Assets/Plugins/Android: Android-specific implementation to retrieve installed apps etc, written in Java