/* * Copyright (C) 2023 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 android.app; import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.SuppressLint; import android.database.AbstractCursor; import android.database.MatrixCursor; /** * Custom cursor implementation to hold a cross-process cursor to pass data to caller. * * @hide */ @SystemApi public class StatsCursor extends AbstractCursor { private final MatrixCursor mMatrixCursor; private final int[] mColumnTypes; private final String[] mColumnNames; private final int mRowCount; /** * @hide **/ public StatsCursor(String[] queryData, String[] columnNames, int[] columnTypes, int rowCount) { mColumnTypes = columnTypes; mColumnNames = columnNames; mRowCount = rowCount; mMatrixCursor = new MatrixCursor(columnNames); for (int i = 0; i < rowCount; i++) { MatrixCursor.RowBuilder builder = mMatrixCursor.newRow(); for (int j = 0; j < columnNames.length; j++) { int dataIndex = i * columnNames.length + j; builder.add(columnNames[j], queryData[dataIndex]); } } } /** * Returns the numbers of rows in the cursor. * * @return the number of rows in the cursor. */ @Override public int getCount() { return mRowCount; } /** * Returns a string array holding the names of all of the columns in the * result set in the order in which they were listed in the result. * * @return the names of the columns returned in this query. */ @Override @NonNull public String[] getColumnNames() { return mColumnNames; } /** * Returns the value of the requested column as a String. * * @param column the zero-based index of the target column. * @return the value of that column as a String. */ @Override @NonNull public String getString(int column) { return mMatrixCursor.getString(column); } /** * Returns the value of the requested column as a short. * * @param column the zero-based index of the target column. * @return the value of that column as a short. */ @Override @SuppressLint("NoByteOrShort") public short getShort(int column) { return mMatrixCursor.getShort(column); } /** * Returns the value of the requested column as an int. * * @param column the zero-based index of the target column. * @return the value of that column as an int. */ @Override public int getInt(int column) { return mMatrixCursor.getInt(column); } /** * Returns the value of the requested column as a long. * * @param column the zero-based index of the target column. * @return the value of that column as a long. */ @Override public long getLong(int column) { return mMatrixCursor.getLong(column); } /** * Returns the value of the requested column as a float. * * @param column the zero-based index of the target column. * @return the value of that column as a float. */ @Override public float getFloat(int column) { return mMatrixCursor.getFloat(column); } /** * Returns the value of the requested column as a double. * * @param column the zero-based index of the target column. * @return the value of that column as a double. */ @Override public double getDouble(int column) { return mMatrixCursor.getDouble(column); } /** * Returns true if the value in the indicated column is null. * * @param column the zero-based index of the target column. * @return whether the column value is null. */ @Override public boolean isNull(int column) { return mMatrixCursor.isNull(column); } /** * Returns the data type of the given column's value. * * @param column the zero-based index of the target column. * @return column value type */ @Override public int getType(int column) { return mColumnTypes[column]; } /** * {@inheritDoc} */ @Override public boolean onMove(int oldPosition, int newPosition) { return mMatrixCursor.moveToPosition(newPosition); } }