[Android 13] Модификация исходного кода Google Native Desktop Launcher3, изменение макета рабочего стола (приложения на первом экране, виджеты, панель навигации, панель задач устройства с большим экраном)

Предисловие

Недавно я получил запрос на сертификацию Google EDLA. Я отвечаю за модификацию собственного макета рабочего стола Google. Изучая исходный код, я опубликую некоторые идеи по модификации. Вы можете обратиться к нему, чтобы узнать, есть ли какая-либо полезная информация для ты. К основным модификациям относятся:

1. Панель поиска и нижняя панель навигации не центрированы.
2. Приложения посередине не расположены должным образом. Подробности см. в Mocke.
3. Нейтральные приложения S-записи, зеркального отображения экрана Kshare и страницы приветствия не поддерживаются. добавлен на собственный рабочий стол Google.

Ситуация с фиг.:

Справочное изображение:

1. Изменения в окне поиска Google.

Области, затронутые изменениями:

1、Launcher3\res\xml\device_profiles.xml

2. com/android/launcher3/Workspace.java.

1. Сначала просмотрите код device_profiles.xml. Обычно устройства с большим экраном (планшеты) загружают макет 6*5, а мобильные устройства загружают макет мобильного телефона. В этом файле определены 4 различных типа макета. Как определить какая раскладка загружена устройством?Шерстяная ткань? Вы можете долго нажимать значок приложения на рабочем столе, затем наблюдать, сколько сеток можно переместить, а затем находить положение макета, которое нужно изменить, в зависимости от количества строк и столбцов. Например, мое устройство загружает макет 6 * 5. Я изменяю здесь **launcher:numSearchContainerColumns="5"**, чтобы изменить окно поиска Google, чтобы оно занимало 5 сеток (всего 7 сеток на горизонтальном экране).

<--这个行数可以根据自己想要的效果修改,比如我就改了7*6布局,6行7列--/>	
	<grid-option
        launcher:name="6_by_5"
        launcher:numRows="6" 
        launcher:numColumns="7"
        launcher:numSearchContainerColumns="5"
        launcher:numFolderRows="3"
        launcher:numFolderColumns="4"
        launcher:numHotseatIcons="0"
        launcher:hotseatColumnSpanLandscape="2"
        launcher:numAllAppsColumns="6"
        launcher:isScalable="true"
        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
        launcher:devicePaddingId="@xml/paddings_6x5"
        launcher:dbFile="launcher_6_by_5.db"
        launcher:defaultLayoutId="@xml/default_workspace_6x5"
        launcher:deviceCategory="tablet" >

        <display-option
            launcher:name="Tablet"
            launcher:minWidthDps="900"
            launcher:minHeightDps="820"
            launcher:minCellHeight="120"
            launcher:minCellWidth="102"
            launcher:minCellHeightLandscape="104"
            launcher:minCellWidthLandscape="120"
            launcher:iconImageSize="60"
            launcher:iconTextSize="14"
            launcher:borderSpaceHorizontal="16"
            launcher:borderSpaceVertical="64"
            launcher:borderSpaceLandscapeHorizontal="64"
            launcher:borderSpaceLandscapeVertical="16"
            launcher:horizontalMargin="54"
            launcher:horizontalMarginLandscape="120"
            launcher:allAppsCellWidth="96"
            launcher:allAppsCellHeight="142"
            launcher:allAppsCellWidthLandscape="126"
            launcher:allAppsCellHeightLandscape="126"
            launcher:allAppsIconSize="60"
            launcher:allAppsIconTextSize="14"
            launcher:allAppsBorderSpaceHorizontal="8"
            launcher:allAppsBorderSpaceVertical="16"
            launcher:allAppsBorderSpaceLandscape="16"
            launcher:hotseatBarBottomSpace="30"
            launcher:hotseatBarBottomSpaceLandscape="40"
            launcher:canBeDefault="true" />

    </grid-option>

</profiles>

2. Измените положение поля поиска Google в файле workspace.java. Найдите этот метод в классе: bindAndInitFirstWorkspaceScreen и найдите его здесь.

    public void bindAndInitFirstWorkspaceScreen() {
    
    
        if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
    
    
            return;
        }

        // Add the first page
        CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());
        // Always add a first page pinned widget on the first screen.
        if (mFirstPagePinnedItem == null) {
    
    
            // In transposed layout, we add the first page pinned widget in the Grid.
            // As workspace does not touch the edges, we do not need a full
            // width first page pinned widget.
            mFirstPagePinnedItem = LayoutInflater.from(getContext())
                    .inflate(R.layout.search_container_workspace, firstPage, false);
        }

        int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;
        //格子数从0开始算,这里表示搜索框位置从X轴第2格子,y轴第3个格子算起,x轴占据5(cellHSpan)个格子,y轴占据1个格子
        CellLayoutLayoutParams lp = new CellLayoutLayoutParams(1, 2, cellHSpan, 1, FIRST_SCREEN_ID);
        lp.canReorder = false;
        if (!firstPage.addViewToCellLayout(
                mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {
    
    
            Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
            mFirstPagePinnedItem = null;
        }
    }

Совет: Если в начале на рабочем столе нет окна поиска Google, вы можете добавить его в виде виджета. При добавлении виджета возможны две ситуации. Конкретный метод зависит от того, прочитала ли система конфигурацию. Если нет, используйте его. Первый способ — добавить его непосредственно в файл макета, например res/xml/default_workspace_6x5.xml:

<appwidget
    container="-100"
    screen="0"
    x="1"
    y="2"
    spanX="5"
    spanY="1"
    packageName="com.google.android.googlequicksearchbox"
    className="com.google.android.googlequicksearchbox.SearchWidgetProvider"/>

Другой способ — добавить, например, Release\vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml\partner_default_layout.xml в файл конфигурации в пакете google_gms.

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 Google Inc. All Rights Reserved. -->
<favorites>
  <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
  <!-- Dialer Messaging Calendar Contacts Camera -->
  <!--<favorite container="-101" screen="0" x="0" y="0" packageName="com.google.android.dialer" className="com.google.android.dialer.extensions.GoogleDialtactsActivity"/>-->
  <!--<favorite container="-101" screen="1" x="1" y="0" packageName="com.google.android.apps.messaging" className="com.google.android.apps.messaging.ui.ConversationListActivity"/>-->
  <!-- <favorite container="-101" screen="0" x="0" y="0" packageName="com.android.settings" className="com.android.settings.Settings"/> -->
  <!-- <favorite container="-101" screen="1" x="1" y="0" packageName="com.android.deskclock" className="com.android.deskclock.DeskClock"/> -->
  <!-- <favorite container="-101" screen="2" x="2" y="0" packageName="com.google.android.calendar" className="com.android.calendar.event.LaunchInfoActivity"/> -->
  <!-- <favorite container="-101" screen="3" x="3" y="0" packageName="com.google.android.contacts" className="com.android.contacts.activities.PeopleActivity"/> -->
  <!-- <favorite container="-101" screen="4" x="4" y="0" packageName="com.android.camera2" className="com.android.camera.CameraLauncher"/> -->
  <!-- In Launcher3, workspaces extend infinitely to the right, incrementing from zero -->
  <!-- Google folder -->
  <!-- Google, Chrome, Gmail, Maps, YouTube, (Drive), (Music), (Movies), Duo, Photos -->
  <folder title="@string/google_folder_title" screen="0" x="1" y="3">
    <favorite packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchActivity"/>
    <favorite packageName="com.android.chrome" className="com.google.android.apps.chrome.Main"/>
    <favorite packageName="com.google.android.gm" className="com.google.android.gm.ConversationListActivityGmail"/>
    <favorite packageName="com.google.android.apps.maps" className="com.google.android.maps.MapsActivity"/>
    <favorite packageName="com.google.android.youtube" className="com.google.android.youtube.app.honeycomb.Shell$HomeActivity"/>
    <favorite packageName="com.google.android.apps.docs" className="com.google.android.apps.docs.app.NewMainProxyActivity"/>
    <favorite packageName="com.google.android.apps.youtube.music" className="com.google.android.apps.youtube.music.activities.MusicActivity"/>
    <favorite packageName="com.google.android.videos" className="com.google.android.videos.GoogleTvEntryPoint"/>
    <favorite packageName="com.google.android.apps.tachyon" className="com.google.android.apps.tachyon.MainActivity"/>
    <favorite packageName="com.google.android.apps.photos" className="com.google.android.apps.photos.home.HomeActivity"/>
  </folder>
  <favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>
  
  <appwidget screen="0" x="2" y="0" packageName="com.android.deskclock" className="com.android.alarmclock.DigitalAppWidgetProvider" spanX="3" spanY="2" />
  <appwidget screen="0" x="1" y="2" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" spanX="5" spanY="1" />
</favorites>

Закомментированное содержимое — это приложение, определяющее отображение hotSeat на рабочем столе. Тег appwidget используется для добавления виджетов. Часы на рабочем столе можно добавить следующим образом. Тег папки определяет папку рабочего стола, которая может определять приложения, которые будут храниться. в папке. .

2. Измените положение приложения на первом экране.

Как и в окне поиска Google, количество строк и столбцов рабочего стола определяется в файле device_profiles.xml, а затем измененное местоположение определяется на основе того, читает ли система файл макета Partner_default_layout.xml; (1) если да прочитайте, он находится в файле Partner_default_layout.xml. Определите имя пакета, тип и информацию о местоположении приложения. Например, <favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>добавьте приложение Google Store в 6-й столбец screen="0" (первый экран) и 4-ю строку сетки. . (2) Если файл макета Partner_default_layout.xml не читается, измените расположение приложения в соответствующем файле X×X.xml.

3. Модификация нижней панели задач и панели навигации.

1. Если приложение hotSeat установлено внизу, то есть тег контейнера="-101", определенный в Partner_default_layout.xml (часть кода, закомментированная в файле), то приложение, зафиксированное внизу, будет отображаться на рабочем столе. Отображение последней панели задач. Если приложения, закрепленные hotSeat, заблокированы, последняя панель задач будет отображаться по умолчанию для замены закрепленных приложений. Количество значков, отображаемых на последней панели задач, зависит от средства запуска:numHotseatIcons=" 0" в файле device_profiles.xml. isTablet Присвойте атрибуту значение false , что означает, что для устройства установлено значение На экране мобильного телефона последняя панель задач не отображается на экране мобильного телефона, а панель навигации по умолчанию будет центрирована. Я пробовал этот метод, но он не работает на больших устройствах. -экранные устройства и не могут добиться желаемого эффекта.Вы можете прочитать что он написал: Устройства с большим экраном Панель навигации справа

2. Если вы используете мой метод, установите количество значков, отображаемых hotSeat, на 0: launcher:numHotseatIcons="0"
Если вы скомпилируете его напрямую, во время выполнения возникнет исключение во время выполнения. Взяв журнал, вы обнаружите, что в исходном коде есть много мест который будет удален при расчете макета. Берем numHotseatIcons, и мы знаем, что делитель не может быть равен 0, поэтому рабочий стол вылетает с ошибкой. На данный момент нам нужно изменить место, где возникает исключение ( обратите внимание, что установка numHotseatIcons в 1 и 0 приведет к исключению , поскольку для numHotseatIcons есть операция -1). Измененное местоположение выглядит следующим образом:
com/android /launcher3/DeviceProfile.java
В этой категории нажмите Ctrl+F для поиска numShownHotseatIcons. Все расчеты, связанные с numShownHotseatIcons, будут оценены. Если оно равно 0, вы можете изменить алгоритм на другой. Вы

также можете искать и отслеживать переменную numHotseatIcons глобально в файле device_profiles.xml и отслеживайте его шаг за шагом. Перейдите к классу DeviceProfile.java, который сделает весь процесс более понятным.

Вот конкретное расположение моих изменений. На снимках экрана есть номера строк для справки

: этот метод, который также используется в нем.

Измените эти два метода расчета

и измените их здесь. Мы удалили недавнюю панель задач! !

4. Следующим шагом будет центрирование панели навигации.

Сначала мы наблюдаем за файлом device_profiles.xml и замечаем, что есть эта переменная.

Ища эту переменную, мы отслеживаем код и обнаруживаем, что эта переменная контролирует значение dp нижней панели навигации от правой границы. Чем больше значение, тем чем ближе к середине.С этой идеей пусть Центрировать панель навигации несложно.Прежде всего, мы знаем, что панель навигации центрируется справа, потому что система определяет, что это устройство с большим экраном планшет. Поскольку мы хотим сохранить атрибут планшета, мы не можем контролировать центрирование панели навигации, переведя устройство в мобильный режим. Таким образом, вы можете контролировать правое поле!

Изменить это значение очень просто. Вам нужно только изменить значение ресурса, на который ссылаются.

Мы входим в файл и меняем правое поле.

Вы можете медленно отлаживать это значение. У меня оно по центру.

5. Резюме

Напишите резюме: Сначала определите, загружает ли система файл макета в Partner_gms, а затем доработайте код макета. Я изучал этот исходный код больше недели. В Интернете недостаточно информации по лаунчеру3 Android 13. В итоге мне приходится самому изучать исходный код отслеживания, а за это время компилировать и отлаживать десятки раз! !
конечный эффект

рекомендация

отblog.csdn.net/m0_47798608/article/details/134318707