7ac0ef1cb1
Bug: 144953948 Bug: 137777105 The new lite proto builder is used to send two types of logging to statsd 1) Snapshot logging 2) App launch, task launch, task dismiss Statsd will be connected once platform CL is submitted Change-Id: If606cee5288fe4bd6c522605ae84eb0f24174f5b
303 lines
10 KiB
Java
303 lines
10 KiB
Java
/*
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
package com.android.launcher3;
|
|
|
|
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP;
|
|
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT;
|
|
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
|
|
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
|
|
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
|
|
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
|
|
|
|
import android.content.ComponentName;
|
|
import android.content.ContentValues;
|
|
import android.content.Intent;
|
|
import android.os.Process;
|
|
import android.os.UserHandle;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import com.android.launcher3.logger.LauncherAtom;
|
|
import com.android.launcher3.util.ContentWriter;
|
|
|
|
|
|
|
|
/**
|
|
* Represents an item in the launcher.
|
|
*/
|
|
public class ItemInfo {
|
|
|
|
public static final boolean DEBUG = true;
|
|
public static final int NO_ID = -1;
|
|
|
|
/**
|
|
* The id in the settings database for this item
|
|
*/
|
|
public int id = NO_ID;
|
|
|
|
/**
|
|
* One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
|
|
* {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
|
|
* {@link LauncherSettings.Favorites#ITEM_TYPE_DEEP_SHORTCUT}
|
|
* {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER},
|
|
* {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET} or
|
|
* {@link LauncherSettings.Favorites#ITEM_TYPE_CUSTOM_APPWIDGET}.
|
|
*/
|
|
public int itemType;
|
|
|
|
/**
|
|
* The id of the container that holds this item. For the desktop, this will be
|
|
* {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it
|
|
* will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders
|
|
* it will be the id of the folder.
|
|
*/
|
|
public int container = NO_ID;
|
|
|
|
/**
|
|
* Indicates the screen in which the shortcut appears if the container types is
|
|
* {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. (i.e., ignore if the container type is
|
|
* {@link LauncherSettings.Favorites#CONTAINER_HOTSEAT})
|
|
*/
|
|
public int screenId = -1;
|
|
|
|
/**
|
|
* Indicates the X position of the associated cell.
|
|
*/
|
|
public int cellX = -1;
|
|
|
|
/**
|
|
* Indicates the Y position of the associated cell.
|
|
*/
|
|
public int cellY = -1;
|
|
|
|
/**
|
|
* Indicates the X cell span.
|
|
*/
|
|
public int spanX = 1;
|
|
|
|
/**
|
|
* Indicates the Y cell span.
|
|
*/
|
|
public int spanY = 1;
|
|
|
|
/**
|
|
* Indicates the minimum X cell span.
|
|
*/
|
|
public int minSpanX = 1;
|
|
|
|
/**
|
|
* Indicates the minimum Y cell span.
|
|
*/
|
|
public int minSpanY = 1;
|
|
|
|
/**
|
|
* Indicates the position in an ordered list.
|
|
*/
|
|
public int rank = 0;
|
|
|
|
/**
|
|
* Title of the item
|
|
*/
|
|
public CharSequence title;
|
|
|
|
/**
|
|
* Content description of the item.
|
|
*/
|
|
public CharSequence contentDescription;
|
|
|
|
public UserHandle user;
|
|
|
|
public ItemInfo() {
|
|
user = Process.myUserHandle();
|
|
}
|
|
|
|
ItemInfo(ItemInfo info) {
|
|
copyFrom(info);
|
|
}
|
|
|
|
public void copyFrom(ItemInfo info) {
|
|
id = info.id;
|
|
cellX = info.cellX;
|
|
cellY = info.cellY;
|
|
spanX = info.spanX;
|
|
spanY = info.spanY;
|
|
rank = info.rank;
|
|
screenId = info.screenId;
|
|
itemType = info.itemType;
|
|
container = info.container;
|
|
user = info.user;
|
|
contentDescription = info.contentDescription;
|
|
}
|
|
|
|
public Intent getIntent() {
|
|
return null;
|
|
}
|
|
|
|
@Nullable
|
|
public ComponentName getTargetComponent() {
|
|
Intent intent = getIntent();
|
|
if (intent != null) {
|
|
return intent.getComponent();
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public void writeToValues(ContentWriter writer) {
|
|
writer.put(LauncherSettings.Favorites.ITEM_TYPE, itemType)
|
|
.put(LauncherSettings.Favorites.CONTAINER, container)
|
|
.put(LauncherSettings.Favorites.SCREEN, screenId)
|
|
.put(LauncherSettings.Favorites.CELLX, cellX)
|
|
.put(LauncherSettings.Favorites.CELLY, cellY)
|
|
.put(LauncherSettings.Favorites.SPANX, spanX)
|
|
.put(LauncherSettings.Favorites.SPANY, spanY)
|
|
.put(LauncherSettings.Favorites.RANK, rank);
|
|
}
|
|
|
|
public void readFromValues(ContentValues values) {
|
|
itemType = values.getAsInteger(LauncherSettings.Favorites.ITEM_TYPE);
|
|
container = values.getAsInteger(LauncherSettings.Favorites.CONTAINER);
|
|
screenId = values.getAsInteger(LauncherSettings.Favorites.SCREEN);
|
|
cellX = values.getAsInteger(LauncherSettings.Favorites.CELLX);
|
|
cellY = values.getAsInteger(LauncherSettings.Favorites.CELLY);
|
|
spanX = values.getAsInteger(LauncherSettings.Favorites.SPANX);
|
|
spanY = values.getAsInteger(LauncherSettings.Favorites.SPANY);
|
|
rank = values.getAsInteger(LauncherSettings.Favorites.RANK);
|
|
}
|
|
|
|
/**
|
|
* Write the fields of this item to the DB
|
|
*/
|
|
public void onAddToDatabase(ContentWriter writer) {
|
|
if (screenId == Workspace.EXTRA_EMPTY_SCREEN_ID) {
|
|
// We should never persist an item on the extra empty screen.
|
|
throw new RuntimeException("Screen id should not be EXTRA_EMPTY_SCREEN_ID");
|
|
}
|
|
|
|
writeToValues(writer);
|
|
writer.put(LauncherSettings.Favorites.PROFILE_ID, user);
|
|
}
|
|
|
|
@Override
|
|
public final String toString() {
|
|
return getClass().getSimpleName() + "(" + dumpProperties() + ")";
|
|
}
|
|
|
|
protected String dumpProperties() {
|
|
return "id=" + id
|
|
+ " type=" + LauncherSettings.Favorites.itemTypeToString(itemType)
|
|
+ " container=" + LauncherSettings.Favorites.containerToString((int)container)
|
|
+ " targetComponent=" + getTargetComponent()
|
|
+ " screen=" + screenId
|
|
+ " cell(" + cellX + "," + cellY + ")"
|
|
+ " span(" + spanX + "," + spanY + ")"
|
|
+ " minSpan(" + minSpanX + "," + minSpanY + ")"
|
|
+ " rank=" + rank
|
|
+ " user=" + user
|
|
+ " title=" + title;
|
|
}
|
|
|
|
/**
|
|
* Whether this item is disabled.
|
|
*/
|
|
public boolean isDisabled() {
|
|
return false;
|
|
}
|
|
|
|
public int getViewId() {
|
|
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
|
|
// This cast is safe as long as the id < 0x00FFFFFF
|
|
// Since we jail all the dynamically generated views, there should be no clashes
|
|
// with any other views.
|
|
return id;
|
|
}
|
|
|
|
/**
|
|
* Returns if an Item is a predicted item
|
|
*/
|
|
public boolean isPredictedItem() {
|
|
return container == LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION
|
|
|| container == LauncherSettings.Favorites.CONTAINER_PREDICTION;
|
|
}
|
|
|
|
/**
|
|
* Can be overridden by inherited classes to fill in {@link LauncherAtom.ItemInfo}
|
|
*/
|
|
public void setItemBuilder(LauncherAtom.ItemInfo.Builder builder) {
|
|
}
|
|
|
|
/**
|
|
* Creates {@link LauncherAtom.ItemInfo} with important fields and parent container info.
|
|
*/
|
|
public LauncherAtom.ItemInfo buildProto(Intent intent, FolderInfo fInfo) {
|
|
|
|
LauncherAtom.ItemInfo.Builder itemBuilder = LauncherAtom.ItemInfo.newBuilder();
|
|
itemBuilder.setIsWork(user != Process.myUserHandle());
|
|
ComponentName cn = getTargetComponent();
|
|
switch (itemType) {
|
|
case ITEM_TYPE_APPLICATION:
|
|
itemBuilder.setApplication(LauncherAtom.Application.newBuilder()
|
|
.setComponentName(cn.flattenToShortString())
|
|
.setPackageName(cn.getPackageName()));
|
|
break;
|
|
case ITEM_TYPE_DEEP_SHORTCUT:
|
|
case ITEM_TYPE_SHORTCUT:
|
|
itemBuilder.setShortcut(LauncherAtom.Shortcut.newBuilder()
|
|
.setShortcutName(cn.flattenToShortString()));
|
|
break;
|
|
case ITEM_TYPE_APPWIDGET:
|
|
setItemBuilder(itemBuilder);
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
if (fInfo != null) {
|
|
LauncherAtom.FolderContainer.Builder folderBuilder =
|
|
LauncherAtom.FolderContainer.newBuilder();
|
|
folderBuilder.setGridX(cellX).setGridY(cellY).setPageIndex(screenId);
|
|
|
|
switch (fInfo.container) {
|
|
case CONTAINER_HOTSEAT:
|
|
folderBuilder.setHotseat(LauncherAtom.HotseatContainer.newBuilder()
|
|
.setIndex(fInfo.screenId));
|
|
break;
|
|
case CONTAINER_DESKTOP:
|
|
folderBuilder.setWorkspace(LauncherAtom.WorkspaceContainer.newBuilder()
|
|
.setPageIndex(fInfo.screenId)
|
|
.setGridX(fInfo.cellX).setGridY(fInfo.cellY));
|
|
break;
|
|
}
|
|
itemBuilder.setFolder(folderBuilder);
|
|
} else {
|
|
switch (container) {
|
|
case CONTAINER_HOTSEAT:
|
|
itemBuilder.setHotseat(LauncherAtom.HotseatContainer.newBuilder()
|
|
.setIndex(screenId));
|
|
break;
|
|
case CONTAINER_DESKTOP:
|
|
itemBuilder.setWorkspace(LauncherAtom.WorkspaceContainer.newBuilder()
|
|
.setGridX(cellX)
|
|
.setGridY(cellY)
|
|
.setPageIndex(screenId));
|
|
break;
|
|
}
|
|
}
|
|
return itemBuilder.build();
|
|
}
|
|
}
|