Added support for "showOnlyCustom"

Added support for "showOnlyCustom": Only shows apps specified in appnames.txt.
This commit is contained in:
tverona1
2019-07-28 00:23:09 -07:00
parent 4b3bd0b2ee
commit a5c987acef
6 changed files with 178 additions and 81 deletions
+71 -70
View File
@@ -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
+12 -1
View File
@@ -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;
}
+27 -5
View File
@@ -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
/// <summary>
/// Static method to delete the excludedFile
/// </summary>
/// <param name="packageName"></param>
static public void DeleteExcludedApksFile()
/// <returns>true if file exists</returns>
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<string> 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
-1
View File
@@ -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>())
{
boxCollider.enabled = false;
+24 -3
View File
@@ -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<Toggle>().SetIsOnWithoutNotify(this.config.show2D);
// Set ShowOnlyCustom toggle
this.showOnlyCustomToggle.GetComponent<Toggle>().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<Toggle>().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<GridPopulation>().StartPopulate();
}
+44 -1
View File
@@ -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