2986e0b4d1
This will make it easier to test CellLayout, also we should avoid circular dependencies as much as poisble. This also allows the CellLayout to be created in other containers that are not workspace. Bug: 318417510 Test: creating HotseatReorderUnitTest in follow up cl Test: TaplReorderWidgets Test: ReorderAlgorithmUnitTest Flag: NA Change-Id: Ic45029a244cb11f8d6775c50b90af9c56f01eaa3
97 lines
3.5 KiB
Kotlin
97 lines
3.5 KiB
Kotlin
/*
|
|
* Copyright (C) 2024 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.celllayout
|
|
|
|
import android.content.Context
|
|
import android.graphics.Point
|
|
import android.view.View
|
|
import androidx.test.core.app.ApplicationProvider
|
|
import com.android.launcher3.CellLayout
|
|
import com.android.launcher3.CellLayoutContainer
|
|
import com.android.launcher3.DeviceProfile
|
|
import com.android.launcher3.InvariantDeviceProfile
|
|
import com.android.launcher3.MultipageCellLayout
|
|
import com.android.launcher3.util.ActivityContextWrapper
|
|
import org.junit.rules.TestWatcher
|
|
import org.junit.runner.Description
|
|
|
|
/**
|
|
* Create CellLayouts to be used in Unit testing and make sure to set the DeviceProfile back to
|
|
* normal.
|
|
*/
|
|
class UnitTestCellLayoutBuilderRule : TestWatcher() {
|
|
|
|
private var prevNumColumns = 0
|
|
private var prevNumRows = 0
|
|
|
|
private val applicationContext =
|
|
ActivityContextWrapper(ApplicationProvider.getApplicationContext())
|
|
|
|
private val container =
|
|
object : CellLayoutContainer {
|
|
override fun getCellLayoutId(cellLayout: CellLayout): Int = 0
|
|
|
|
override fun getCellLayoutIndex(cellLayout: CellLayout): Int = 0
|
|
|
|
override fun getPanelCount(): Int = 1
|
|
|
|
override fun getPageDescription(pageIndex: Int): String = ""
|
|
}
|
|
|
|
override fun starting(description: Description?) {
|
|
val dp = getDeviceProfile()
|
|
prevNumColumns = dp.inv.numColumns
|
|
prevNumRows = dp.inv.numRows
|
|
}
|
|
|
|
override fun finished(description: Description?) {
|
|
val dp = getDeviceProfile()
|
|
dp.inv.numColumns = prevNumColumns
|
|
dp.inv.numRows = prevNumRows
|
|
}
|
|
|
|
fun createCellLayout(width: Int, height: Int, isMulti: Boolean): CellLayout {
|
|
val dp = getDeviceProfile()
|
|
// modify the device profile.
|
|
dp.inv.numColumns = if (isMulti) width / 2 else width
|
|
dp.inv.numRows = height
|
|
dp.cellLayoutBorderSpacePx = Point(0, 0)
|
|
val cl =
|
|
if (isMulti) MultipageCellLayout(getWrappedContext(applicationContext, dp))
|
|
else CellLayout(getWrappedContext(applicationContext, dp), container)
|
|
// I put a very large number for width and height so that all the items can fit, it doesn't
|
|
// need to be exact, just bigger than the sum of cell border
|
|
cl.measure(
|
|
View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.EXACTLY),
|
|
View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.EXACTLY)
|
|
)
|
|
return cl
|
|
}
|
|
|
|
private fun getDeviceProfile(): DeviceProfile =
|
|
InvariantDeviceProfile.INSTANCE[applicationContext].getDeviceProfile(applicationContext)
|
|
.copy(applicationContext)
|
|
|
|
private fun getWrappedContext(context: Context, dp: DeviceProfile): Context {
|
|
return object : ActivityContextWrapper(context) {
|
|
override fun getDeviceProfile(): DeviceProfile {
|
|
return dp
|
|
}
|
|
}
|
|
}
|
|
}
|