Initial MinusOS Balsam

Signed-off-by: SkyMinus <minus_rav@qq.com>
This commit is contained in:
SkyMinus
2025-06-30 17:04:17 +08:00
parent 230d1dca1c
commit 821a9ddc31
279 changed files with 199 additions and 21420 deletions

View File

@@ -14,4 +14,4 @@
# limitations under the License.
# Rules for QCOM targets
include $(TOPDIR)vendor/lineage/build/core/qcom_target.mk
include $(TOPDIR)vendor/minus/build/core/qcom_target.mk

View File

@@ -6,4 +6,4 @@ $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
endef
# Include board/platform macros
include vendor/lineage/build/core/utils.mk
include vendor/minus/build/core/utils.mk

6
build/core/version.mk Normal file
View File

@@ -0,0 +1,6 @@
ADDITIONAL_SYSTEM_PROPERTIES += \
ro.minus.build.date=$(BUILD_DATE) \
ro.minus.fingerprint=$(ROM_FINGERPRINT) \
ro.minus.version=$(MINUS_VERSION) \
ro.minus.device=$(MINUS_BUILD) \
ro.modversion=$(MINUS_VERSION)

View File

@@ -9,12 +9,12 @@ function check_product()
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
return
fi
if (echo -n $1 | grep -q -e "^lineage_") ; then
LINEAGE_BUILD=$(echo -n $1 | sed -e 's/^lineage_//g')
if (echo -n $1 | grep -q -e "^minus_") ; then
MINUS_BUILD=$(echo -n $1 | sed -e 's/^minus_//g')
else
LINEAGE_BUILD=
MINUS_BUILD=
fi
export LINEAGE_BUILD
export MINUS_BUILD
TARGET_PRODUCT=$1 \
TARGET_RELEASE=$2 \
@@ -41,7 +41,7 @@ function breakfast()
{
target=$1
local variant=$2
source ${ANDROID_BUILD_TOP}/vendor/lineage/vars/aosp_target_release
source ${ANDROID_BUILD_TOP}/vendor/minus/vars/aosp_target_release
if [ $# -eq 0 ]; then
# No arguments, so let's have the full menu
@@ -51,12 +51,12 @@ function breakfast()
# A buildtype was specified, assume a full device name
lunch $target
else
# This is probably just the Lineage model name
# This is probably just the Minus model name
if [ -z "$variant" ]; then
variant="userdebug"
fi
lunch lineage_$target-$aosp_target_release-$variant
lunch minus_$target-$aosp_target_release-$variant
fi
fi
return $?
@@ -67,7 +67,7 @@ alias bib=breakfast
function eat()
{
if [ "$OUT" ] ; then
ZIPPATH=`ls -tr "$OUT"/lineage-*.zip | tail -1`
ZIPPATH=`ls -tr "$OUT"/minus-*.zip | tail -1`
if [ ! -f $ZIPPATH ] ; then
echo "Nothing to eat"
return 1
@@ -75,13 +75,13 @@ function eat()
echo "Waiting for device..."
adb wait-for-device-recovery
echo "Found device"
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD"); then
if (adb shell getprop ro.minus.device | grep -q "$MINUS_BUILD"); then
echo "Rebooting to sideload for install"
adb reboot sideload-auto-reboot
adb wait-for-sideload
adb sideload $ZIPPATH
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
echo "The connected device does not appear to be $MINUS_BUILD, run away!"
fi
return $?
else
@@ -205,45 +205,6 @@ function dddclient()
fi
}
function lineageremote()
{
if ! git rev-parse --git-dir &> /dev/null
then
echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up."
return 1
fi
git remote rm lineage 2> /dev/null
local REMOTE=$(git config --get remote.github.projectname)
local LINEAGE="true"
if [ -z "$REMOTE" ]
then
REMOTE=$(git config --get remote.aosp.projectname)
LINEAGE="false"
fi
if [ -z "$REMOTE" ]
then
REMOTE=$(git config --get remote.clo.projectname)
LINEAGE="false"
fi
if [ $LINEAGE = "false" ]
then
local PROJECT=$(echo $REMOTE | sed -e "s#platform/#android/#g; s#/#_#g")
local PFX="LineageOS/"
else
local PROJECT=$REMOTE
fi
local LINEAGE_USER=$(git config --get review.review.lineageos.org.username)
if [ -z "$LINEAGE_USER" ]
then
git remote add lineage ssh://review.lineageos.org:29418/$PFX$PROJECT
else
git remote add lineage ssh://$LINEAGE_USER@review.lineageos.org:29418/$PFX$PROJECT
fi
echo "Remote 'lineage' created"
}
function aospremote()
{
if ! git rev-parse --git-dir &> /dev/null
@@ -321,7 +282,7 @@ function githubremote()
local PROJECT=$(echo $REMOTE | sed -e "s#platform/#android/#g; s#/#_#g")
git remote add github https://github.com/LineageOS/$PROJECT
git remote add github https://github.com/MinusOS/$PROJECT
echo "Remote 'github' created"
}
@@ -366,14 +327,14 @@ function installboot()
adb wait-for-device-recovery
adb root
adb wait-for-device-recovery
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD");
if (adb shell getprop ro.minus.device | grep -q "$MINUS_BUILD");
then
adb push $OUT/boot.img /cache/
adb shell dd if=/cache/boot.img of=$PARTITION
adb shell rm -rf /cache/boot.img
echo "Installation complete."
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
echo "The connected device does not appear to be $MINUS_BUILD, run away!"
fi
}
@@ -404,296 +365,17 @@ function installrecovery()
adb wait-for-device-recovery
adb root
adb wait-for-device-recovery
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD");
if (adb shell getprop ro.minus.device | grep -q "$MINUS_BUILD");
then
adb push $OUT/recovery.img /cache/
adb shell dd if=/cache/recovery.img of=$PARTITION
adb shell rm -rf /cache/recovery.img
echo "Installation complete."
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
echo "The connected device does not appear to be $MINUS_BUILD, run away!"
fi
}
function lineagegerrit() {
if [ "$(basename $SHELL)" = "zsh" ]; then
# zsh does not define FUNCNAME, derive from funcstack
local FUNCNAME=$funcstack[1]
fi
if [ $# -eq 0 ]; then
$FUNCNAME help
return 1
fi
local user=`git config --get review.review.lineageos.org.username`
local review=`git config --get remote.github.review`
local project=`git config --get remote.github.projectname`
local command=$1
shift
case $command in
help)
if [ $# -eq 0 ]; then
cat <<EOF
Usage:
$FUNCNAME COMMAND [OPTIONS] [CHANGE-ID[/PATCH-SET]][{@|^|~|:}ARG] [-- ARGS]
Commands:
fetch Just fetch the change as FETCH_HEAD
help Show this help, or for a specific command
pull Pull a change into current branch
push Push HEAD or a local branch to Gerrit for a specific branch
Any other Git commands that support refname would work as:
git fetch URL CHANGE && git COMMAND OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
See '$FUNCNAME help COMMAND' for more information on a specific command.
Example:
$FUNCNAME checkout -b topic 1234/5
works as:
git fetch http://DOMAIN/p/PROJECT refs/changes/34/1234/5 \\
&& git checkout -b topic FETCH_HEAD
will checkout a new branch 'topic' base on patch-set 5 of change 1234.
Patch-set 1 will be fetched if omitted.
EOF
return
fi
case $1 in
__cmg_*) echo "For internal use only." ;;
changes|for)
if [ "$FUNCNAME" = "lineagegerrit" ]; then
echo "'$FUNCNAME $1' is deprecated."
fi
;;
help) $FUNCNAME help ;;
fetch|pull) cat <<EOF
usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET]
works as:
git $1 OPTIONS http://DOMAIN/p/PROJECT \\
refs/changes/HASH/CHANGE-ID/{PATCH-SET|1}
Example:
$FUNCNAME $1 1234
will $1 patch-set 1 of change 1234
EOF
;;
push) cat <<EOF
usage: $FUNCNAME push [OPTIONS] [LOCAL_BRANCH:]REMOTE_BRANCH
works as:
git push OPTIONS ssh://USER@DOMAIN:29418/PROJECT \\
{LOCAL_BRANCH|HEAD}:refs/for/REMOTE_BRANCH
Example:
$FUNCNAME push fix6789:gingerbread
will push local branch 'fix6789' to Gerrit for branch 'gingerbread'.
HEAD will be pushed from local if omitted.
EOF
;;
*)
$FUNCNAME __cmg_err_not_supported $1 && return
cat <<EOF
usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET][{@|^|~|:}ARG] [-- ARGS]
works as:
git fetch http://DOMAIN/p/PROJECT \\
refs/changes/HASH/CHANGE-ID/{PATCH-SET|1} \\
&& git $1 OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
EOF
;;
esac
;;
__cmg_get_ref)
$FUNCNAME __cmg_err_no_arg $command $# && return 1
local change_id patchset_id hash
case $1 in
*/*)
change_id=${1%%/*}
patchset_id=${1#*/}
;;
*)
change_id=$1
patchset_id=1
;;
esac
hash=$(($change_id % 100))
case $hash in
[0-9]) hash="0$hash" ;;
esac
echo "refs/changes/$hash/$change_id/$patchset_id"
;;
fetch|pull)
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
local change=$1
shift
git $command $@ http://$review/p/$project \
$($FUNCNAME __cmg_get_ref $change) || return 1
;;
push)
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
if [ -z "$user" ]; then
echo >&2 "Gerrit username not found."
return 1
fi
local local_branch remote_branch
case $1 in
*:*)
local_branch=${1%:*}
remote_branch=${1##*:}
;;
*)
local_branch=HEAD
remote_branch=$1
;;
esac
shift
git push $@ ssh://$user@$review:29418/$project \
${local_branch}:refs/for/$remote_branch || return 1
;;
changes|for)
if [ "$FUNCNAME" = "lineagegerrit" ]; then
echo >&2 "'$FUNCNAME $command' is deprecated."
fi
;;
__cmg_err_no_arg)
if [ $# -lt 2 ]; then
echo >&2 "'$FUNCNAME $command' missing argument."
elif [ $2 -eq 0 ]; then
if [ -n "$3" ]; then
$FUNCNAME help $1
else
echo >&2 "'$FUNCNAME $1' missing argument."
fi
else
return 1
fi
;;
__cmg_err_not_repo)
if [ -z "$review" -o -z "$project" ]; then
echo >&2 "Not currently in any reviewable repository."
else
return 1
fi
;;
__cmg_err_not_supported)
$FUNCNAME __cmg_err_no_arg $command $# && return
case $1 in
#TODO: filter more git commands that don't use refname
init|add|rm|mv|status|clone|remote|bisect|config|stash)
echo >&2 "'$FUNCNAME $1' is not supported."
;;
*) return 1 ;;
esac
;;
#TODO: other special cases?
*)
$FUNCNAME __cmg_err_not_supported $command && return 1
$FUNCNAME __cmg_err_no_arg $command $# help && return 1
$FUNCNAME __cmg_err_not_repo && return 1
local args="$@"
local change pre_args refs_arg post_args
case "$args" in
*--\ *)
pre_args=${args%%-- *}
post_args="-- ${args#*-- }"
;;
*) pre_args="$args" ;;
esac
args=($pre_args)
pre_args=
if [ ${#args[@]} -gt 0 ]; then
change=${args[${#args[@]}-1]}
fi
if [ ${#args[@]} -gt 1 ]; then
pre_args=${args[0]}
for ((i=1; i<${#args[@]}-1; i++)); do
pre_args="$pre_args ${args[$i]}"
done
fi
while ((1)); do
case $change in
""|--)
$FUNCNAME help $command
return 1
;;
*@*)
if [ -z "$refs_arg" ]; then
refs_arg="@${change#*@}"
change=${change%%@*}
fi
;;
*~*)
if [ -z "$refs_arg" ]; then
refs_arg="~${change#*~}"
change=${change%%~*}
fi
;;
*^*)
if [ -z "$refs_arg" ]; then
refs_arg="^${change#*^}"
change=${change%%^*}
fi
;;
*:*)
if [ -z "$refs_arg" ]; then
refs_arg=":${change#*:}"
change=${change%%:*}
fi
;;
*) break ;;
esac
done
$FUNCNAME fetch $change \
&& git $command $pre_args FETCH_HEAD$refs_arg $post_args \
|| return 1
;;
esac
}
function lineagerebase() {
local repo=$1
local refs=$2
local pwd="$(pwd)"
local dir="$(gettop)/$repo"
if [ -z $repo ] || [ -z $refs ]; then
echo "LineageOS Gerrit Rebase Usage: "
echo " lineagerebase <path to project> <patch IDs on Gerrit>"
echo " The patch IDs appear on the Gerrit commands that are offered."
echo " They consist on a series of numbers and slashes, after the text"
echo " refs/changes. For example, the ID in the following command is 26/8126/2"
echo ""
echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD"
echo ""
return
fi
if [ ! -d $dir ]; then
echo "Directory $dir doesn't exist in tree."
return
fi
cd $dir
repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g)
echo "Starting branch..."
repo start tmprebase .
echo "Bringing it up to date..."
repo sync .
echo "Fetching change..."
git fetch "http://review.lineageos.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD
if [ "$?" != "0" ]; then
echo "Error cherry-picking. Not uploading!"
return
fi
echo "Uploading..."
repo upload .
echo "Cleaning up..."
repo abandon tmprebase .
cd $pwd
}
function mka() {
m "$@"
}
@@ -766,7 +448,7 @@ function dopush()
echo "Device Found."
fi
if (adb shell getprop ro.lineage.device | grep -q "$LINEAGE_BUILD") || [ "$FORCE_PUSH" = "true" ];
if (adb shell getprop ro.minus.device | grep -q "$MINUS_BUILD") || [ "$FORCE_PUSH" = "true" ];
then
# retrieve IP and PORT info if we're using a TCP connection
TCPIPPORT=$(adb devices \
@@ -885,7 +567,7 @@ EOF
rm -f $OUT/.log
return 0
else
echo "The connected device does not appear to be $LINEAGE_BUILD, run away!"
echo "The connected device does not appear to be $MINUS_BUILD, run away!"
fi
}
@@ -896,11 +578,6 @@ alias mmmap='dopush mmma'
alias mkap='dopush mka'
alias cmkap='dopush cmka'
function repopick() {
T=$(gettop)
$T/vendor/lineage/build/tools/repopick.py $@
}
function sort-blobs-list() {
T=$(gettop)
$T/tools/extract-utils/sort-blobs-list.py $@
@@ -910,7 +587,7 @@ function fixup_common_out_dir() {
common_out_dir=$(_get_build_var_cached OUT_DIR)/target/common
target_device=$(_get_build_var_cached TARGET_DEVICE)
common_target_out=common-${target_device}
if [ ! -z $LINEAGE_FIXUP_COMMON_OUT ]; then
if [ ! -z $MINUS_FIXUP_COMMON_OUT ]; then
if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then
mv ${common_out_dir} ${common_out_dir}-${target_device}
ln -s ${common_target_out} ${common_out_dir}

View File

@@ -1,8 +1,8 @@
// LineageOS soong configs
// MinusOS soong configs
bootstrap_go_package {
name: "soong-lineage-generator",
pkgPath: "lineage/soong/generator",
name: "soong-minus-generator",
pkgPath: "minus/soong/generator",
deps: [
"blueprint",
"blueprint-pathtools",
@@ -17,11 +17,11 @@ bootstrap_go_package {
pluginFor: ["soong_build"],
}
lineage_generator {
minus_generator {
name: "generated_kernel_includes",
// The headers make command
cmd: "$(PATH_OVERRIDE_SOONG) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_SOURCE) O=$(KERNEL_BUILD_OUT_PREFIX)$(genDir) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) headers_install && vendor/lineage/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
cmd: "$(PATH_OVERRIDE_SOONG) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_SOURCE) O=$(KERNEL_BUILD_OUT_PREFIX)$(genDir) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) headers_install && vendor/minus/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
// Directories that can be imported by a cc_* module generated_headers property
export_include_dirs: [
@@ -42,11 +42,11 @@ lineage_generator {
],
}
lineage_generator {
minus_generator {
name: "prebuilt_kernel_includes",
// The headers extract command
cmd: "mkdir -p $(KERNEL_BUILD_OUT_PREFIX)$(genDir) && gzip -d < $(TARGET_PREBUILT_KERNEL_HEADERS) | tar -x -C $(KERNEL_BUILD_OUT_PREFIX)$(genDir) && vendor/lineage/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
cmd: "mkdir -p $(KERNEL_BUILD_OUT_PREFIX)$(genDir) && gzip -d < $(TARGET_PREBUILT_KERNEL_HEADERS) | tar -x -C $(KERNEL_BUILD_OUT_PREFIX)$(genDir) && vendor/minus/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
// Directories that can be imported by a cc_* module generated_headers property
export_include_dirs: [
@@ -59,8 +59,8 @@ lineage_generator {
}
bootstrap_go_package {
name: "soong-lineage-mkdir",
pkgPath: "lineage/soong/mkdir",
name: "soong-minus-mkdir",
pkgPath: "minus/soong/mkdir",
deps: [
"blueprint",
"blueprint-pathtools",

View File

@@ -1,6 +1,6 @@
function __print_lineage_functions_help() {
function __print_minus_functions_help() {
cat <<EOF
Additional LineageOS functions:
Additional functions:
- brunch: Runs "breakfast" and "mka bacon" for the provided device target.
- breakfast: Wrapper for "lunch".
- eat: Reboots to recovery and installs the compiled OTA package.
@@ -9,12 +9,9 @@ Additional LineageOS functions:
- mmp: Builds all of the modules in the current directory and pushes them to the device.
- mmap: Builds all of the modules in the current directory and its dependencies, then pushes the package to the device.
- mmmp: Builds all of the modules in the supplied directories and pushes them to the device.
- lineagegerrit: A Git wrapper that fetches/pushes patch from/to LineageOS Gerrit Review.
- lineagerebase: Rebase a Gerrit change and push it again.
- lineageremote: Add git remote for LineageOS Gerrit Review.
- aospremote: Add git remote for matching AOSP repository.
- cloremote: Add git remote for matching CodeLinaro repository.
- githubremote: Add git remote for LineageOS Github.
- githubremote: Add git remote for Github.
- privateremote: Add git remote for Github with ssh access.
- mka: Alias to "m".
- mkap: Builds the module(s) using mka and pushes them to the device.

View File

@@ -27,7 +27,7 @@ import (
)
func init() {
android.RegisterModuleType("lineage_generator", GeneratorFactory)
android.RegisterModuleType("minus_generator", GeneratorFactory)
}
var String = proptools.String
@@ -203,12 +203,12 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if depRoot == "" {
depRoot = ctx.ModuleDir()
} else {
depRoot = lineageExpandVariables(ctx, depRoot)
depRoot = minusExpandVariables(ctx, depRoot)
}
// Glob dep_files property
for _, dep_file := range g.properties.Dep_files {
dep_file = lineageExpandVariables(ctx, dep_file)
dep_file = minusExpandVariables(ctx, dep_file)
globPath := filepath.Join(depRoot, dep_file)
paths, err := ctx.GlobWithDeps(globPath, nil)
if err != nil {
@@ -220,7 +220,7 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
}
cmd := lineageExpandVariables(ctx, String(g.properties.Cmd))
cmd := minusExpandVariables(ctx, String(g.properties.Cmd))
rawCommand, err := android.Expand(cmd, func(name string) (string, error) {
switch name {

View File

@@ -6,12 +6,12 @@ import (
"android/soong/android"
)
func lineageExpandVariables(ctx android.ModuleContext, in string) string {
lineageVars := ctx.Config().VendorConfig("lineageVarsPlugin")
func minusExpandVariables(ctx android.ModuleContext, in string) string {
minusVars := ctx.Config().VendorConfig("minusVarsPlugin")
out, err := android.Expand(in, func(name string) (string, error) {
if lineageVars.IsSet(name) {
return lineageVars.String(name), nil
if minusVars.IsSet(name) {
return minusVars.String(name), nil
}
// This variable is not for us, restore what the original
// variable string will have looked like for an Expand

View File

@@ -18,7 +18,7 @@ import (
"android/soong/android"
)
var pctx = android.NewPackageContext("lineage/soong/mkdir")
var pctx = android.NewPackageContext("minus/soong/mkdir")
func init() {
RegisterBuildComponents(android.InitRegistrationContext)

View File

@@ -58,7 +58,7 @@ func (this *Mkdir) AndroidMkEntries() []android.AndroidMkEntries {
Class: "FAKE",
// Need at least one output file in order for this to take effect.
OutputFile: android.OptionalPathForPath(this.output),
Include: "vendor/lineage/build/core/mkdir.mk",
Include: "vendor/minus/build/core/mkdir.mk",
ExtraEntries: []android.AndroidMkExtraEntriesFunc{
func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
entries.SetString("LOCAL_SOONG_INSTALL_DIR", this.installDir.String())

View File

@@ -1,63 +0,0 @@
#
# Copyright (C) 2018-2021 The LineageOS 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.
#
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/lineage_cf_car_arm64.mk \
$(LOCAL_DIR)/lineage_cf_car_x86_64.mk \
$(LOCAL_DIR)/lineage_cf_phone_arm64.mk \
$(LOCAL_DIR)/lineage_cf_phone_x86_64.mk \
$(LOCAL_DIR)/lineage_cf_tv_x86_64.mk \
$(LOCAL_DIR)/lineage_gsi_arm.mk \
$(LOCAL_DIR)/lineage_gsi_arm64.mk \
$(LOCAL_DIR)/lineage_gsi_x86.mk \
$(LOCAL_DIR)/lineage_gsi_x86_64.mk \
$(LOCAL_DIR)/lineage_gsi_car_arm64.mk \
$(LOCAL_DIR)/lineage_gsi_car_x86_64.mk \
$(LOCAL_DIR)/lineage_gsi_tv_arm.mk \
$(LOCAL_DIR)/lineage_gsi_tv_arm64.mk \
$(LOCAL_DIR)/lineage_gsi_tv_x86.mk \
$(LOCAL_DIR)/lineage_gsi_tv_x86_64.mk \
$(LOCAL_DIR)/lineage_sdk_car_arm64.mk \
$(LOCAL_DIR)/lineage_sdk_car_x86_64.mk \
$(LOCAL_DIR)/lineage_sdk_phone_arm64.mk \
$(LOCAL_DIR)/lineage_sdk_phone_x86_64.mk \
$(LOCAL_DIR)/lineage_sdk_tv_arm.mk \
$(LOCAL_DIR)/lineage_sdk_tv_x86.mk \
$(LOCAL_DIR)/lineage_sdk_tv_x86_64.mk
COMMON_LUNCH_CHOICES := \
lineage_cf_car_arm64-userdebug \
lineage_cf_car_x86_64-userdebug \
lineage_cf_phone_arm64-userdebug \
lineage_cf_phone_x86_64-userdebug \
lineage_cf_tv_x86_64-userdebug \
lineage_gsi_arm-userdebug \
lineage_gsi_arm64-userdebug \
lineage_gsi_x86-userdebug \
lineage_gsi_x86_64-userdebug \
lineage_gsi_car_arm64-userdebug \
lineage_gsi_car_x86_64-userdebug \
lineage_gsi_tv_arm-userdebug \
lineage_gsi_tv_arm64-userdebug \
lineage_gsi_tv_x86-userdebug \
lineage_gsi_tv_x86_64-userdebug \
lineage_sdk_car_arm64-userdebug \
lineage_sdk_car_x86_64-userdebug \
lineage_sdk_phone_arm64-userdebug \
lineage_sdk_phone_x86_64-userdebug \
lineage_sdk_tv_arm-userdebug \
lineage_sdk_tv_x86-userdebug \
lineage_sdk_tv_x86_64-userdebug

View File

@@ -1,15 +0,0 @@
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
$(call inherit-product, device/google/cuttlefish/vsoc_arm64_only/auto/aosp_cf.mk)
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_cf_car_arm64
PRODUCT_MODEL := LineageOS Cuttlefish car built for arm64

View File

@@ -1,15 +0,0 @@
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64_only/auto/aosp_cf.mk)
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_cf_car_x86_64
PRODUCT_MODEL := LineageOS Cuttlefish car built for x86_64

View File

@@ -1,12 +0,0 @@
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
$(call inherit-product, device/google/cuttlefish/vsoc_arm64/phone/aosp_cf.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
# Overrides
PRODUCT_NAME := lineage_cf_phone_arm64
PRODUCT_MODEL := LineageOS Cuttlefish phone built for arm64

View File

@@ -1,12 +0,0 @@
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/phone/aosp_cf.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
# Overrides
PRODUCT_NAME := lineage_cf_phone_x86_64
PRODUCT_MODEL := LineageOS Cuttlefish phone built for x86_64

View File

@@ -1,12 +0,0 @@
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64/tv/aosp_cf.mk)
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
# Overrides
PRODUCT_NAME := lineage_cf_tv_x86_64
PRODUCT_MODEL := LineageOS Cuttlefish TV built for x86_64

View File

@@ -1,21 +0,0 @@
# Copyright (C) 2019-2020 The LineageOS 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.
$(call inherit-product, vendor/lineage/config/common_car.mk)
EMULATOR_VENDOR_NO_SENSORS := true
EMULATOR_VENDOR_NO_SOUND := true
# Allow building otatools
TARGET_FORCE_OTA_PACKAGE := true

View File

@@ -1,18 +0,0 @@
# Copyright (C) 2019-2020 The LineageOS 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.
$(call inherit-product, vendor/lineage/config/common_full_phone.mk)
# Allow building otatools
TARGET_FORCE_OTA_PACKAGE := true

View File

@@ -1,19 +0,0 @@
# Copyright (C) 2019-2020 The LineageOS 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.
$(call inherit-product, device/google/atv/products/atv_base.mk)
$(call inherit-product, vendor/lineage/config/common_full_tv.mk)
# Allow building otatools
TARGET_FORCE_OTA_PACKAGE := true

View File

@@ -1,27 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, device/generic/common/gsi_arm.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_arm
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=

View File

@@ -1,28 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, device/generic/common/gsi_arm64.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_arm64
PRODUCT_DEVICE := generic_arm64
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=

View File

@@ -1,29 +0,0 @@
# Copyright (C) 2022 The LineageOS 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.
$(call inherit-product, device/generic/car/gsi_car_arm64.mk)
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \
system/app/Home/Home.apk
PRODUCT_NAME := lineage_gsi_car_arm64

View File

@@ -1,29 +0,0 @@
# Copyright (C) 2022 The LineageOS 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.
$(call inherit-product, device/generic/car/gsi_car_x86_64.mk)
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \
system/app/Home/Home.apk
PRODUCT_NAME := lineage_gsi_car_x86_64

View File

@@ -1,24 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, build/target/product/gsi_release.mk)
$(call inherit-product, device/google/atv/products/aosp_tv_arm.mk)
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_tv_arm
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=

View File

@@ -1,24 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, build/target/product/gsi_release.mk)
$(call inherit-product, device/google/atv/products/aosp_tv_arm64.mk)
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_tv_arm64
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=

View File

@@ -1,24 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, device/google/atv/products/aosp_tv_x86.mk)
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
PRODUCT_NAME := lineage_gsi_tv_x86
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,26 +0,0 @@
# Copyright (C) 2018-2020 The LineageOS 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.
$(call inherit-product, device/google/atv/products/aosp_tv_x86_64.mk)
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
TARGET_SUPPORTS_64_BIT_APPS := true
PRODUCT_NAME := lineage_gsi_tv_x86_64
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS :=
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,23 +0,0 @@
# Copyright (C) 2018-2022 The LineageOS 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.
$(call inherit-product, device/generic/common/gsi_x86.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_x86

View File

@@ -1,23 +0,0 @@
# Copyright (C) 2018-2022 The LineageOS 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.
$(call inherit-product, device/generic/common/gsi_x86_64.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_gsi_x86_64

View File

@@ -1,26 +0,0 @@
# Copyright (C) 2018-2022 The LineageOS 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.
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk.mk)
TARGET_NO_KERNEL_OVERRIDE := true
PRODUCT_NAME := lineage_sdk_car_arm64
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,24 +0,0 @@
# Copyright (C) 2018-2022 The LineageOS 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.
include vendor/lineage/build/target/product/lineage_generic_car_target.mk
$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk.mk)
PRODUCT_NAME := lineage_sdk_car_x86_64
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,31 +0,0 @@
# Copyright (C) 2021-2024 The LineageOS 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.
$(call inherit-product, device/generic/goldfish/64bitonly/product/sdk_phone64_arm64.mk)
$(call inherit-product, vendor/lineage/build/target/product/lineage_sdk_phone_arm64_board.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
# Always build modules from source
PRODUCT_MODULE_BUILD_FROM_SOURCE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_sdk_phone_arm64
PRODUCT_MODEL := LineageOS Android SDK built for arm64
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := vendor/lineage/build/target/product/source.properties

View File

@@ -1,22 +0,0 @@
# Copyright (C) 2021-2024 The LineageOS 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.
# 2.0G + 8M
BOARD_SUPER_PARTITION_SIZE := 2155872256
BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE := 2147483648
PRODUCT_SDK_ADDON_COPY_FILES += \
device/generic/goldfish/data/etc/advancedFeatures.ini.arm:images/arm64-v8a/advancedFeatures.ini \
device/generic/goldfish/data/etc/encryptionkey.img:images/arm64-v8a/encryptionkey.img \
$(EMULATOR_KERNEL_FILE):images/arm64-v8a/kernel-ranchu

View File

@@ -1,41 +0,0 @@
# Copyright (C) 2021-2024 The LineageOS 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.
$(call inherit-product, device/generic/goldfish/64bitonly/product/sdk_phone64_x86_64.mk)
include vendor/lineage/build/target/product/lineage_generic_target.mk
include device/generic/goldfish/board/kernel/x86_64.mk
# Always build modules from source
PRODUCT_MODULE_BUILD_FROM_SOURCE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_sdk_phone_x86_64
PRODUCT_MODEL := LineageOS Android SDK built for x86_64
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties
# Increase Partition size: 8G+8M
BOARD_SUPER_PARTITION_SIZE ?= 8598323200
BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE ?= 8589934592
# Packaging sdk_addon target
PRODUCT_SDK_ADDON_COPY_FILES += \
device/generic/goldfish/data/etc/advancedFeatures.ini:images/x86_64/advancedFeatures.ini \
device/generic/goldfish/data/etc/encryptionkey.img:images/x86_64/encryptionkey.img \
$(EMULATOR_KERNEL_FILE):images/x86_64/kernel-ranchu

View File

@@ -1,29 +0,0 @@
# Copyright (C) 2022 The LineageOS 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.
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
$(call inherit-product, device/google/atv/products/sdk_atv_armv7.mk)
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_sdk_tv_arm
PRODUCT_MODEL := LineageOS Android TV SDK built for ARM
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,30 +0,0 @@
# Copyright (C) 2022 The LineageOS 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.
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
$(call inherit-product, device/google/atv/products/sdk_atv_x86.mk)
TARGET_KERNEL_USE := 6.1
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_sdk_tv_x86
PRODUCT_MODEL := LineageOS Android TV SDK built for x86
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,29 +0,0 @@
# Copyright (C) 2024 The LineageOS 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.
include vendor/lineage/build/target/product/lineage_generic_tv_target.mk
$(call inherit-product, device/google/atv/products/sdk_atv64_x86_64.mk)
TARGET_NO_KERNEL_OVERRIDE := true
# Enable mainline checking
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
# Overrides
PRODUCT_NAME := lineage_sdk_tv_x86_64
PRODUCT_MODEL := LineageOS Android TV SDK built for x86_64
PRODUCT_SDK_ADDON_NAME := lineage
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP := $(LOCAL_PATH)/source.properties

View File

@@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDszCCApugAwIBAgIJAOEEE8dzw8VPMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRIw
EAYDVQQKDAlMaW5lYWdlT1MxEjAQBgNVBAsMCUxpbmVhZ2VPUzESMBAGA1UEAwwJ
TGluZWFnZU9TMB4XDTE3MDEwNzA0MjEyNVoXDTQ0MDUyNTA0MjEyNVowcDELMAkG
A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx
EjAQBgNVBAoMCUxpbmVhZ2VPUzESMBAGA1UECwwJTGluZWFnZU9TMRIwEAYDVQQD
DAlMaW5lYWdlT1MwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmTdPh
+EIDj/A/Z7jpvwlTD8KRPLU+NlTHjsINvIsecRNijKWrwIYFYMtELBtR+Yttzl5Z
xJA38n9k9IrvBJCrmRBvCAeiEw4aizqs2DTmVvCFS2Amd7ZsAHsUwtDCjQ3GE0He
ZI2HnbWannnhKIhzGjuxxh+1j3JawHHeErYQk97MVoWsJHTO4s8i8ORL8ghBDZHF
0fYKp5RVSIIrrXVqcOD+F8g/NeX6Wb5N0rRGBI+bQjMhhv8KpH7TnCEN6f2YHFVx
nsjzDKrEQVwhYF8T9X0OzfBoLEhOlFZ0jevoDi8uCxz0f7ldkv/0Zz4W9jeB87LH
zUuQQEGr6134UFmZAgMBAAGjUDBOMB0GA1UdDgQWBBRyljIn1mxMTV+gkWrCLHk8
1F9DXDAfBgNVHSMEGDAWgBRyljIn1mxMTV+gkWrCLHk81F9DXDAMBgNVHRMEBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCKJH4ByccucWfewkmT8j9TnAdhjCgZ7k0+
rpbSgxc66+ESRpQFxMSAUu8exy8pSawGd7SerFBVvqL+dajdPfyLPM+I+xDEoMJ3
ncKGHoC0RRKMGEhc4rS090/wOJJHZZtThlcjdND5vybMwmHngzl8o4CNWhneJvjb
hNkqxocrC9vGCsdo5Kx00ULn8sXVwcq7yl0bqtuSMlKxm6CVA3DVVnB8N8OZyTam
fgj9F0jOpWVtit1/ohd+1jB5bY3g+ulXCydKBFkJhNXAZf4welNG61SWLkH1gNGk
SEYxEuLV9JGjm7n5oqDKxYVcKKNfvbGtSmrqsq6i+QVuc/xIdzfr
-----END CERTIFICATE-----

View File

@@ -1,7 +0,0 @@
Pkg.Desc=LineageOS System Image API ${PLATFORM_VERSION} ${TARGET_CPU_ABI}
Pkg.Revision=1
AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
SystemImage.Abi=${TARGET_CPU_ABI}
SystemImage.TagId=lineage
SystemImage.TagDisplay=LineageOS

View File

@@ -14,16 +14,16 @@
# limitations under the License.
# -----------------------------------------------------------------
# Lineage OTA update package
# Minus OTA update package
LINEAGE_TARGET_PACKAGE := $(PRODUCT_OUT)/lineage-$(LINEAGE_VERSION).zip
MINUS_TARGET_PACKAGE := $(PRODUCT_OUT)/MinusOS-$(MINUS_VERSION).zip
SHA256 := prebuilts/build-tools/path/$(HOST_PREBUILT_TAG)/sha256sum
$(LINEAGE_TARGET_PACKAGE): $(INTERNAL_OTA_PACKAGE_TARGET)
$(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(LINEAGE_TARGET_PACKAGE)
$(hide) $(SHA256) $(LINEAGE_TARGET_PACKAGE) | sed "s|$(PRODUCT_OUT)/||" > $(LINEAGE_TARGET_PACKAGE).sha256sum
@echo "Package Complete: $(LINEAGE_TARGET_PACKAGE)" >&2
$(MINUS_TARGET_PACKAGE): $(INTERNAL_OTA_PACKAGE_TARGET)
$(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(MINUS_TARGET_PACKAGE)
$(hide) $(SHA256) $(MINUS_TARGET_PACKAGE) | sed "s|$(PRODUCT_OUT)/||" > $(MINUS_TARGET_PACKAGE).sha256sum
@echo "Package Complete: $(MINUS_TARGET_PACKAGE)" >&2
.PHONY: bacon
bacon: $(LINEAGE_TARGET_PACKAGE) $(DEFAULT_GOAL)
bacon: $(MINUS_TARGET_PACKAGE) $(DEFAULT_GOAL)

View File

@@ -8,7 +8,7 @@ INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img
ifeq ($(strip $(BOARD_KERNEL_PREBUILT_DT)),)
ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),)
DTBTOOL_NAME := dtbToolLineage
DTBTOOL_NAME := dtbToolMinus
else
DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL)
endif
@@ -16,7 +16,7 @@ endif
DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX)
ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),)
# dtbToolLineage will search subdirectories
# dtbToolMinus will search subdirectories
possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/
else
# Most specific paths must come first in possible_dtb_dirs

View File

@@ -1,77 +0,0 @@
#
# Copyright (C) 2010 The Android Open Source Project
# Copyright (C) 2016 The CyanogenMod 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.
#
# Makefile for producing lineage sdk coverage reports.
# Run "make lineage-sdk-test-coverage" in the $ANDROID_BUILD_TOP directory.
lineage_sdk_api_coverage_exe := $(HOST_OUT_EXECUTABLES)/lineage-sdk-api-coverage
dexdeps_exe := $(HOST_OUT_EXECUTABLES)/dexdeps
coverage_out := $(HOST_OUT)/lineage-sdk-api-coverage
api_text_description := lineage-sdk/api/lineage_current.txt
api_xml_description := $(coverage_out)/api.xml
$(api_xml_description) : $(api_text_description) $(APICHECK)
$(hide) echo "Converting API file to XML: $@"
$(hide) mkdir -p $(dir $@)
$(hide) $(APICHECK_COMMAND) -convert2xml $< $@
lineage-sdk-test-coverage-report := $(coverage_out)/lineage-sdk-test-coverage.html
lineage_sdk_tests_apk := $(call intermediates-dir-for,APPS,LineagePlatformTests)/package.apk
lineagesettingsprovider_tests_apk := $(call intermediates-dir-for,APPS,LineageSettingsProviderTests)/package.apk
lineage_sdk_api_coverage_dependencies := $(lineage_sdk_api_coverage_exe) $(dexdeps_exe) $(api_xml_description)
$(lineage-sdk-test-coverage-report): PRIVATE_TEST_CASES := $(lineage_sdk_tests_apk) $(lineagesettingsprovider_tests_apk)
$(lineage-sdk-test-coverage-report): PRIVATE_LINEAGE_SDK_API_COVERAGE_EXE := $(lineage_sdk_api_coverage_exe)
$(lineage-sdk-test-coverage-report): PRIVATE_DEXDEPS_EXE := $(dexdeps_exe)
$(lineage-sdk-test-coverage-report): PRIVATE_API_XML_DESC := $(api_xml_description)
$(lineage-sdk-test-coverage-report): $(lineage_sdk_tests_apk) $(lineagesettingsprovider_tests_apk) $(lineage_sdk_api_coverage_dependencies) | $(ACP)
$(call generate-lineage-coverage-report,"LINEAGE-SDK API Coverage Report",\
$(PRIVATE_TEST_CASES),html)
.PHONY: lineage-sdk-test-coverage
lineage-sdk-test-coverage : $(lineage-sdk-test-coverage-report)
# Put the test coverage report in the dist dir if "lineage-sdk" is among the build goals.
ifneq ($(filter lineage-sdk, $(MAKECMDGOALS)),)
$(call dist-for-goals, lineage-sdk, $(lineage-sdk-test-coverage-report):lineage-sdk-test-coverage-report.html)
endif
# Arguments;
# 1 - Name of the report printed out on the screen
# 2 - List of apk files that will be scanned to generate the report
# 3 - Format of the report
define generate-lineage-coverage-report
$(hide) mkdir -p $(dir $@)
$(hide) $(PRIVATE_LINEAGE_SDK_API_COVERAGE_EXE) -d $(PRIVATE_DEXDEPS_EXE) -a $(PRIVATE_API_XML_DESC) -f $(3) -o $@ $(2) -cm
@ echo $(1): file://$@
endef
# Reset temp vars
lineage_sdk_api_coverage_dependencies :=
lineage-sdk-combined-coverage-report :=
lineage-sdk-combined-xml-coverage-report :=
lineage-sdk-verifier-coverage-report :=
lineage-sdk-test-coverage-report :=
api_xml_description :=
api_text_description :=
coverage_out :=
dexdeps_exe :=
lineage_sdk_api_coverage_exe :=
lineage_sdk_verifier_apk :=
android_lineage_sdk_zip :=

View File

@@ -181,22 +181,18 @@ else
$(error "NO KERNEL CONFIG")
else
ifneq ($(TARGET_FORCE_PREBUILT_KERNEL),)
ifneq ($(filter RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL,$(LINEAGE_BUILDTYPE)),)
$(error "PREBUILT KERNEL IS NOT ALLOWED ON OFFICIAL BUILDS!")
else
$(warning **********************************************************)
$(warning * Kernel source found and configuration was defined, *)
$(warning * but prebuilt kernel is being forced. *)
$(warning * While this is likely intentional, *)
$(warning * it is NOT SUPPORTED WHATSOEVER. *)
$(warning * Generated kernel headers may not align with *)
$(warning * the ABI of kernel you're including. *)
$(warning * Please unset TARGET_FORCE_PREBUILT_KERNEL *)
$(warning * to build the kernel from source. *)
$(warning **********************************************************)
FULL_KERNEL_BUILD := false
KERNEL_BIN := $(TARGET_PREBUILT_KERNEL)
endif
$(warning **********************************************************)
$(warning * Kernel source found and configuration was defined, *)
$(warning * but prebuilt kernel is being forced. *)
$(warning * While this is likely intentional, *)
$(warning * it is NOT SUPPORTED WHATSOEVER. *)
$(warning * Generated kernel headers may not align with *)
$(warning * the ABI of kernel you're including. *)
$(warning * Please unset TARGET_FORCE_PREBUILT_KERNEL *)
$(warning * to build the kernel from source. *)
$(warning **********************************************************)
FULL_KERNEL_BUILD := false
KERNEL_BIN := $(TARGET_PREBUILT_KERNEL)
else
FULL_KERNEL_BUILD := true
KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL)
@@ -370,7 +366,7 @@ endef
# $(7): partition image intermediates file list
# $(8): external dependency module intermediates dir
# Depmod requires a well-formed kernel version so 0.0 is used as a placeholder.
define build-image-kernel-modules-lineage
define build-image-kernel-modules-minus
mkdir -p $(2)/lib/modules$(6)
cp $(1) $(2)/lib/modules$(6)
rm -rf $(4)
@@ -536,19 +532,19 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(KERNEL_MODULE
if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \
done); \
[ $$? -ne 0 ] && exit 1; \
($(call build-image-kernel-modules-lineage,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX),$(SYSTEM_KERNEL_MODULES_PARTITION_FILE_LIST),)) || exit "$$?"; \
($(call build-image-kernel-modules-minus,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX),$(SYSTEM_KERNEL_MODULES_PARTITION_FILE_LIST))) || exit "$$?"; \
filtered_modules=$$(for n in $$all_modules; do \
module_name=$$(basename $$n); \
if [[ ! "$(SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \
done); \
($(call build-image-kernel-modules-lineage,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),,$(KERNEL_MODULES_PARTITION_FILE_LIST),$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR)/lib/modules/0.0/$(SYSTEM_KERNEL_MODULE_MOUNTPOINT))) || exit "$$?"; \
($(call build-image-kernel-modules-minus,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),,$(KERNEL_MODULES_PARTITION_FILE_LIST),$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR)/lib/modules/0.0/$(SYSTEM_KERNEL_MODULE_MOUNTPOINT))) || exit "$$?"; \
(for m in $$(find $(SYSTEM_KERNEL_MODULES_OUT) -type f -name "*.ko"); do \
$(KERNEL_OUT)/scripts/sign-file sha1 \
$(KERNEL_OUT)/certs/signing_key.pem \
$(KERNEL_OUT)/certs/signing_key.x509 "$$m"; \
done) || exit "$$?"; \
,\
($(call build-image-kernel-modules-lineage,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),,$(KERNEL_MODULES_PARTITION_FILE_LIST),)) || exit "$$?"; \
($(call build-image-kernel-modules-minus,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),,$(KERNEL_MODULES_PARTITION_FILE_LIST),)) || exit "$$?"; \
) \
$(if $(BOOT_KERNEL_MODULES),\
vendor_boot_modules=$$(for m in $(BOOT_KERNEL_MODULES); do \
@@ -556,7 +552,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(KERNEL_MODULE
if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \
done); \
[ $$? -ne 0 ] && exit 1; \
($(call build-image-kernel-modules-lineage,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),,,)) || exit "$$?"; \
($(call build-image-kernel-modules-minus,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),,)) || exit "$$?"; \
) \
$(if $(RECOVERY_KERNEL_MODULES),\
recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \
@@ -564,7 +560,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(KERNEL_MODULE
if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from RECOVERY_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \
done); \
[ $$? -ne 0 ] && exit 1; \
($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_KERNEL_MODULES_LOAD),,,)) || exit "$$?"; \
($(call build-image-kernel-modules-minus,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_KERNEL_MODULES_LOAD),,,)) || exit "$$?"; \
) \
fi
@@ -666,7 +662,7 @@ ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true)
$(hide) find $(DTBS_BASE) -type f -name "*.dtb*" | xargs rm -f
$(hide) find $(DTBS_OUT) -type f -name "*.dtb*" | xargs rm -f
mv $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/*/*.dtb $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/*/*.dtbo $(DTBS_BASE)/
PATH=$(abspath $(HOST_OUT_EXECUTABLES)):$${PATH} python3 $(BUILD_TOP)/vendor/lineage/build/tools/merge_dtbs.py --base $(DTBS_BASE) --techpack $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom --out $(DTBS_OUT)
PATH=$(abspath $(HOST_OUT_EXECUTABLES)):$${PATH} python3 $(BUILD_TOP)/vendor/minus/build/tools/merge_dtbs.py --base $(DTBS_BASE) --techpack $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom --out $(DTBS_OUT)
cat $(shell find $(DTBS_OUT) -type f -name "${TARGET_MERGE_DTBS_WILDCARD}.dtb" | sort) > $@
else
cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@

View File

@@ -1,208 +0,0 @@
/* =============================================================================
Columns
========================================================================== */
/* Applied to body to debug layout alignments
.grid {
width:100%;
height:100%;
background:url(../images/grid.png) center repeat-y;
top:0px;
margin:auto;
position:absolute;
}
*/
@media screen, projection, print {
.full {
padding: 2.5em 0;
border-top: solid 1px #ddd;
border-bottom: solid 1px #ddd;
background: #f7f7f7;
}
.wrap {
margin: 0 auto;
width: 100%;
min-width:600px;
clear: both;
}
.cols {
height: 1%;
margin: 0 -1.533742331288343558282%;
width: 103.06748466257669%}
*+html .cols {
margin-bottom: 20px;
}
.cols:after {
clear: both;
content: ' ';
display: block;
height: 0;
visibility: hidden;
}
.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12,
.col-13, .col-14, .col-15, .col-16 {
float: left;
margin: 0 1.063829787234% 20px 1.063829787234%;
}
* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html
.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12, * html
.col-13, * html .col-14, * html .col-15, * html .col-16 {
margin: 0;
margin: 0 1.063829787234% 20px 1.063829787234%;
}
[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5,
[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10,
[dir='rtl'] .col-11, [dir='rtl'] .col-12 {
float: right;
}
.col-1 {
width: 4.16666666666667%;
}
.col-2 {
width: 10.4166666666667%;
}
.col-3 {
width: 16.6666666666667%;
}
.col-4 {
width: 22.9166666666667%;
}
.col-5 {
width: 29.1666666666667%;
}
.col-6 {
width: 35.4166666666667%;
}
.col-7 {
width: 41.6666666666667%;
}
.col-8 {
width: 47.9166666666667%;
}
.col-9 {
width: 55.3333333333333%;
}
.col-10 {
width: 60.4166666666667%;
}
.col-11 {
width: 66.6666666666667%;
}
.col-12 {
width: 72.9166666666667%;
}
.col-13 {
width: 79.1666666666667%;
}
.col-14 {
width: 85.4166666666667%;
}
.col-15 {
width: 91.6666666666667%;
}
.col-16 {
width: 97.9166666666667%;
}
#header .col-1,
#nav-x .col-1 { width: 40px }
#header .col-2,
#nav-x .col-2 { width: 100px }
#header .col-3,
#nav-x .col-3 { width: 160px }
#header .col-4,
#nav-x .col-4 { width: 220px }
#header .col-5,
#nav-x .col-5 { width: 280px }
#header .col-6,
#nav-x .col-6 { width: 340px }
#header .col-7,
#nav-x .col-7 { width: 400px }
#header .col-8,
#nav-x .col-8 { width: 460px }
#header .col-9,
#nav-x .col-9 { width: 520px }
#header .col-10,
#nav-x .col-10 { width: 580px }
#header .col-11,
#nav-x .col-11 { width: 640px }
#header .col-12,
#nav-x .col-12 { width: 700px }
#header .col-13,
#nav-x .col-13 { width: 760px }
#header .col-14,
#nav-x .col-14 { width: 820px }
#header .col-15,
#nav-x .col-15 { width: 880px }
#header .col-16,
#nav-x .col-16 { width: 940px }
body {
padding:0 20px;
}
#header,
#searchResults,
#nav-x {
margin:0;
}
#body-content {
margin:0;
}
#body-content > .col-12 {
width:77.9804965%;
margin:0 0 0 0.97%; /* this percentage chosen to make IE9 happy */
}
#side-nav {
width: 19.9804965%;
margin:0 1.063829787234% 0 0;
}
#header .wrap {
max-width: 100%;
}
#header-wrapper #nav-x div.wrap,
#searchResults.wrap {
max-width:100%;
}
.nav-x {
margin:-2px 0 0 0;
}
#devdoc-nav.fixed,
#devdoc-nav.fixed a.totop {
left:20px; /* !important ... for IE i think */
}
#sticky-header {
padding: 0 20px;
}
#sticky-header > div {
width: 100%;
}
.sticky-menu {
width:100%;
left:-20px;
}
.col-right {
margin-right:0px;
}
@media screen and (max-width:772px) {
.col-5, .col-6, .col-7 {
clear: both;
width: 97.0238096%}
}

View File

@@ -1,14 +0,0 @@
#masthead-title {
color: #373332;
text-decoration: none;
font-weight: bold;
margin-left: 5px;
}
#headerLeft a {
text-decoration: none;
}
#header {
border-bottom: 4px solid rgb(22, 124, 128);
}

View File

@@ -1,188 +0,0 @@
$(document).ready(function() {
// prep nav expandos
var pagePath = document.location.pathname;
if (pagePath.indexOf(SITE_ROOT) == 0) {
pagePath = pagePath.substr(SITE_ROOT.length);
if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') {
pagePath += 'index.html';
}
}
if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') {
// If running locally, SITE_ROOT will be a relative path, so account for that by
// finding the relative URL to this page. This will allow us to find links on the page
// leading back to this page.
var pathParts = pagePath.split('/');
var relativePagePathParts = [];
var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3;
for (var i = 0; i < upDirs; i++) {
relativePagePathParts.push('..');
}
for (var i = 0; i < upDirs; i++) {
relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]);
}
relativePagePathParts.push(pathParts[pathParts.length - 1]);
pagePath = relativePagePathParts.join('/');
} else {
// Otherwise the page path should be an absolute URL.
pagePath = SITE_ROOT + pagePath;
}
// select current page in sidenav and set up prev/next links if they exist
var $selNavLink = $('.nav-y').find('a[href="' + pagePath + '"]');
if ($selNavLink.length) {
$selListItem = $selNavLink.closest('li');
$selListItem.addClass('selected');
$selListItem.closest('li>ul').addClass('expanded');
// set up prev links
var $prevLink = [];
var $prevListItem = $selListItem.prev('li');
if ($prevListItem.length) {
if ($prevListItem.hasClass('nav-section')) {
// jump to last topic of previous section
$prevLink = $prevListItem.find('a:last');
} else {
// jump to previous topic in this section
$prevLink = $prevListItem.find('a:eq(0)');
}
} else {
// jump to this section's index page (if it exists)
$prevLink = $selListItem.parents('li').find('a');
}
if ($prevLink.length) {
var prevHref = $prevLink.attr('href');
if (prevHref == SITE_ROOT + 'index.html') {
// Don't show Previous when it leads to the homepage
$('.prev-page-link').hide();
} else {
$('.prev-page-link').attr('href', prevHref).show();
}
} else {
$('.prev-page-link').hide();
}
// set up next links
var $nextLink = [];
if ($selListItem.hasClass('nav-section')) {
// we're on an index page, jump to the first topic
$nextLink = $selListItem.find('ul').find('a:eq(0)')
} else {
// jump to the next topic in this section (if it exists)
$nextLink = $selListItem.next('li').find('a:eq(0)');
if (!$nextLink.length) {
// no more topics in this section, jump to the first topic in the next section
$nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)');
}
}
if ($nextLink.length) {
$('.next-page-link').attr('href', $nextLink.attr('href')).show();
} else {
$('.next-page-link').hide();
}
}
// Set up expand/collapse behavior
$('.nav-y li').has('ul').click(function() {
if ($(this).hasClass('expanded')) {
return;
}
// hide other
var $old = $('.nav-y li.expanded');
if ($old.length) {
var $oldUl = $old.children('ul');
$oldUl.css('height', $oldUl.height() + 'px');
window.setTimeout(function() {
$oldUl
.addClass('animate-height')
.css('height', '');
}, 0);
$old.removeClass('expanded');
}
// show me
$(this).addClass('expanded');
var $ul = $(this).children('ul');
var expandedHeight = $ul.height();
$ul
.removeClass('animate-height')
.css('height', 0);
window.setTimeout(function() {
$ul
.addClass('animate-height')
.css('height', expandedHeight + 'px');
}, 0);
});
// Stop expand/collapse behavior when clicking on nav section links (since we're navigating away
// from the page)
$('.nav-y li').has('ul').find('a:eq(0)').click(function(evt) {
window.location.href = $(this).attr('href');
return false;
});
// Set up play-on-hover <video> tags.
$('video.play-on-hover').bind('click', function(){
$(this).get(0).load(); // in case the video isn't seekable
$(this).get(0).play();
});
// Set up tooltips
var TOOLTIP_MARGIN = 10;
$('acronym').each(function() {
var $target = $(this);
var $tooltip = $('<div>')
.addClass('tooltip-box')
.text($target.attr('title'))
.hide()
.appendTo('body');
$target.removeAttr('title');
$target.hover(function() {
// in
var targetRect = $target.offset();
targetRect.width = $target.width();
targetRect.height = $target.height();
$tooltip.css({
left: targetRect.left,
top: targetRect.top + targetRect.height + TOOLTIP_MARGIN
});
$tooltip.addClass('below');
$tooltip.show();
}, function() {
// out
$tooltip.hide();
});
});
// Set up <h2> deeplinks
$('h2').click(function() {
var id = $(this).attr('id');
if (id) {
document.location.hash = id;
}
});
// Set up fixed navbar
var navBarIsFixed = false;
$(window).scroll(function() {
var scrollTop = $(window).scrollTop();
var navBarShouldBeFixed = (scrollTop > (100 - 40));
if (navBarIsFixed != navBarShouldBeFixed) {
if (navBarShouldBeFixed) {
$('#nav')
.addClass('fixed')
.prependTo('#page-container');
} else {
$('#nav')
.removeClass('fixed')
.prependTo('#nav-container');
}
navBarIsFixed = navBarShouldBeFixed;
}
});
});

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144 72"><defs><style>.cls-1{fill:#167c80;}</style></defs><title>lineage_logo_mark_ltrbox_teal_144x72</title><g id="mark_-_letterbox" data-name="mark - letterbox"><path class="cls-1" d="M112,36a10,10,0,0,0-7.78,3.72l-.38-.15A73.82,73.82,0,0,0,92,36s0,0,0,0a20,20,0,0,0-40,0v0l-.43.09a73.47,73.47,0,0,0-11.42,3.44l-.38.15a10.1,10.1,0,1,0,1.84,3.57h0A69.34,69.34,0,0,1,52.41,40a20,20,0,0,0,39.18,0,69.32,69.32,0,0,1,10.78,3.24h0A10,10,0,1,0,112,36ZM32,52a6,6,0,1,1,6-6A6,6,0,0,1,32,52Zm40,0A16,16,0,1,1,88,36,16,16,0,0,1,72,52Zm40,0a6,6,0,1,1,6-6A6,6,0,0,1,112,52ZM80,36a8,8,0,1,1-8-8A8,8,0,0,1,80,36Z"/></g></svg>

Before

Width:  |  Height:  |  Size: 664 B

View File

@@ -1,679 +0,0 @@
<?cs include:"doctype.cs" ?>
<?cs include:"macros.cs" ?>
<?cs include:"macros_override.cs" ?>
<html<?cs if:devsite ?> devsite<?cs /if ?>>
<?cs include:"head_tag.cs" ?>
<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
<?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
if:reference ?> reference<?cs
/if ?><?cs
elif:design ?>design<?cs
elif:distribute ?>distribute<?cs
/if ?>" itemscope itemtype="http://schema.org/Article">
<div id="doc-api-level" class="<?cs var:class.since ?>" style="display:none"></div>
<a name="top"></a>
<?cs include:"header.cs" ?>
<div class="col-12" id="doc-col">
<div id="api-info-block">
<?cs # are there inherited members ?>
<?cs each:cl=class.inherited ?>
<?cs if:subcount(cl.methods) ?>
<?cs set:inhmethods = #1 ?>
<?cs /if ?>
<?cs if:subcount(cl.constants) ?>
<?cs set:inhconstants = #1 ?>
<?cs /if ?>
<?cs if:subcount(cl.fields) ?>
<?cs set:inhfields = #1 ?>
<?cs /if ?>
<?cs if:subcount(cl.attrs) ?>
<?cs set:inhattrs = #1 ?>
<?cs /if ?>
<?cs /each ?>
<div class="sum-details-links">
<?cs if:inhattrs || inhconstants || inhfields || inhmethods || (!class.subclasses.hidden &&
(subcount(class.subclasses.direct) || subcount(class.subclasses.indirect))) ?>
Summary:
<?cs if:subcount(class.inners) ?>
<a href="#nestedclasses">Nested Classes</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.attrs) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lattrs">XML Attrs</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:inhattrs ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhattrs">Inherited XML Attrs</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.enumConstants) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#enumconstants">Enums</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.constants) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#constants">Constants</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:inhconstants ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhconstants">Inherited Constants</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.fields) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lfields">Fields</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:inhfields ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhfields">Inherited Fields</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.ctors.public) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubctors">Ctors</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.ctors.protected) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#proctors">Protected Ctors</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.methods.public) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubmethods">Methods</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:subcount(class.methods.protected) ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#promethods">Protected Methods</a>
<?cs set:linkcount = #1 ?>
<?cs /if ?>
<?cs if:inhmethods ?>
<?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhmethods">Inherited Methods</a>
<?cs /if ?>
&#124; <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
<?cs /if ?>
</div><!-- end sum-details-links -->
<div class="api-level">
<?cs call:since_tags(class) ?><?cs
if:class.deprecatedsince
?><br>Deprecated since <a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html#ApiLevels"
>API level <?cs var:class.deprecatedsince ?></a><?cs
/if ?>
<?cs call:federated_refs(class) ?>
</div>
</div><!-- end api-info-block -->
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ======== START OF CLASS DATA ======== -->
<div id="jd-header">
<?cs var:class.scope ?>
<?cs var:class.static ?>
<?cs var:class.final ?>
<?cs var:class.abstract ?>
<?cs var:class.kind ?>
<h1 itemprop="name"><?cs var:class.name ?></h1>
<?cs set:colspan = subcount(class.inheritance) ?>
<?cs each:supr = class.inheritance ?>
<?cs if:colspan == 2 ?>
extends <?cs call:type_link(supr.short_class) ?><br/>
<?cs /if ?>
<?cs if:last(supr) && subcount(supr.interfaces) ?>
implements
<?cs each:t=supr.interfaces ?>
<?cs call:type_link(t) ?>
<?cs /each ?>
<?cs /if ?>
<?cs set:colspan = colspan-1 ?>
<?cs /each ?>
<?cs call:show_annotations_list(class) ?>
</div><!-- end header -->
<div id="naMessage"></div>
<div id="jd-content" class="api apilevel-<?cs var:class.since ?>">
<table class="jd-inheritance-table">
<?cs set:colspan = subcount(class.inheritance) ?>
<?cs each:supr = class.inheritance ?>
<tr>
<?cs loop:i = 1, (subcount(class.inheritance)-colspan), 1 ?>
<td class="jd-inheritance-space">&nbsp;<?cs if:(subcount(class.inheritance)-colspan) == i ?>&nbsp;&nbsp;&#x21b3;<?cs /if ?></td>
<?cs /loop ?>
<td colspan="<?cs var:colspan ?>" class="jd-inheritance-class-cell"><?cs
if:colspan == 1
?><?cs call:class_name(class.qualifiedType) ?><?cs
else
?><?cs call:type_link(supr.class) ?><?cs
/if ?></td>
</tr>
<?cs set:colspan = colspan-1 ?>
<?cs /each ?>
</table>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<?cs if:subcount(class.subclasses.direct) && !class.subclasses.hidden ?>
<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
<?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses
<?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?>
</td></tr></table>
<?cs /if ?>
<?cs if:subcount(class.subclasses.indirect) && !class.subclasses.hidden ?>
<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
<?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses
<?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?>
</td></tr></table>
<?cs /if ?>
<div class="jd-descr">
<?cs call:deprecated_warning(class) ?>
<?cs if:subcount(class.descr) ?>
<h2>Class Overview</h2>
<p itemprop="articleBody"><?cs call:tag_list(class.descr) ?></p>
<?cs /if ?>
<?cs call:see_also_tags(class.seeAlso) ?>
</div><!-- jd-descr -->
<?cs # summary macros ?>
<?cs def:write_method_summary(methods, included) ?>
<?cs set:count = #1 ?>
<?cs each:method = methods ?>
<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:method.since ?>" >
<td class="jd-typecol"><nobr>
<?cs var:method.abstract ?>
<?cs var:method.synchronized ?>
<?cs var:method.final ?>
<?cs var:method.static ?>
<?cs call:type_link(method.generic) ?>
<?cs call:type_link(method.returnType) ?></nobr>
</td>
<td class="jd-linkcol" width="100%"><nobr>
<span class="sympad"><?cs call:cond_link(method.name, toroot, method.href, included) ?></span>(<?cs call:parameter_list(method.params) ?>)</nobr>
<?cs if:subcount(method.shortDescr) || subcount(method.deprecated) ?>
<div class="jd-descrdiv">
<?cs call:short_descr(method) ?>
<?cs call:show_annotations_list(method) ?>
</div>
<?cs /if ?>
</td></tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_field_summary(fields, included) ?>
<?cs set:count = #1 ?>
<?cs each:field=fields ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
<td class="jd-typecol"><nobr>
<?cs var:field.scope ?>
<?cs var:field.static ?>
<?cs var:field.final ?>
<?cs call:type_link(field.type) ?></nobr></td>
<td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(field) ?>
<?cs call:show_annotations_list(field) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_constant_summary(fields, included) ?>
<?cs set:count = #1 ?>
<?cs each:field=fields ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
<td class="jd-typecol"><?cs call:type_link(field.type) ?></td>
<td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(field) ?>
<?cs call:show_annotations_list(field) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_attr_summary(attrs, included) ?>
<?cs set:count = #1 ?>
<tr>
<td><nobr><em>Attribute Name</em></nobr></td>
<td><nobr><em>Related Method</em></nobr></td>
<td><nobr><em>Description</em></nobr></td>
</tr>
<?cs each:attr=attrs ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:attr.since ?>" >
<td class="jd-linkcol"><?cs if:included ?><a href="<?cs var:toroot ?><?cs var:attr.href ?>"><?cs /if ?><?cs var:attr.name ?><?cs if:included ?></a><?cs /if ?></td>
<td class="jd-linkcol"><?cs each:m=attr.methods ?>
<?cs call:cond_link(m.name, toroot, m.href, included) ?>
<?cs /each ?>
</td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(attr) ?>&nbsp;
<?cs call:show_annotations_list(attr) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_inners_summary(classes) ?>
<?cs set:count = #1 ?>
<?cs each:cl=class.inners ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
<td class="jd-typecol"><nobr>
<?cs var:cl.scope ?>
<?cs var:cl.static ?>
<?cs var:cl.final ?>
<?cs var:cl.abstract ?>
<?cs var:cl.kind ?></nobr></td>
<td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(cl) ?>&nbsp;
<?cs call:show_annotations_list(cl) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /def ?>
<?cs # end macros ?>
<div class="jd-descr">
<?cs # make sure there's a summary view to display ?>
<?cs if:subcount(class.inners)
|| subcount(class.attrs)
|| inhattrs
|| subcount(class.enumConstants)
|| subcount(class.constants)
|| inhconstants
|| subcount(class.fields)
|| inhfields
|| subcount(class.ctors.public)
|| subcount(class.ctors.protected)
|| subcount(class.methods.public)
|| subcount(class.methods.protected)
|| inhmethods ?>
<h2>Summary</h2>
<?cs if:subcount(class.inners) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ======== NESTED CLASS SUMMARY ======== -->
<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
<?cs call:write_inners_summary(class.inners) ?>
<?cs /if ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<?cs if:subcount(class.attrs) ?>
<!-- =========== FIELD SUMMARY =========== -->
<table id="lattrs" class="jd-sumtable"><tr><th colspan="12">XML Attributes</th></tr>
<?cs call:write_attr_summary(class.attrs, 1) ?>
<?cs /if ?>
<?cs # if there are inherited attrs, write the table ?>
<?cs if:inhattrs ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== FIELD SUMMARY =========== -->
<table id="inhattrs" class="jd-sumtable"><tr><th>
<a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
<div style="clear:left;">Inherited XML Attributes</div></th></tr>
<?cs each:cl=class.inherited ?>
<?cs if:subcount(cl.attrs) ?>
<tr class="api apilevel-<?cs var:cl.since ?>" >
<td colspan="12">
<?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
<div id="inherited-attrs-<?cs var:cl.qualified ?>">
<div id="inherited-attrs-<?cs var:cl.qualified ?>-list"
class="jd-inheritedlinks">
</div>
<div id="inherited-attrs-<?cs var:cl.qualified ?>-summary" style="display: none;">
<table class="jd-sumtable-expando">
<?cs call:write_attr_summary(cl.attrs, cl.included) ?></table>
</div>
</div>
</td></tr>
<?cs /if ?>
<?cs /each ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.enumConstants) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
<table id="enumconstants" class="jd-sumtable"><tr><th colspan="12">Enum Values</th></tr>
<?cs set:count = #1 ?>
<?cs each:field=class.enumConstants ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
<td class="jd-descrcol"><?cs call:type_link(field.type) ?>&nbsp;</td>
<td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, cl.included) ?>&nbsp;</td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(field) ?>&nbsp;
<?cs call:show_annotations_list(field) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
<?cs /if ?>
<?cs if:subcount(class.constants) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr>
<?cs call:write_constant_summary(class.constants, 1) ?>
</table>
<?cs /if ?>
<?cs # if there are inherited constants, write the table ?>
<?cs if:inhconstants ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
<table id="inhconstants" class="jd-sumtable"><tr><th>
<a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
<div style="clear:left;">Inherited Constants</div></th></tr>
<?cs each:cl=class.inherited ?>
<?cs if:subcount(cl.constants) ?>
<tr class="api apilevel-<?cs var:cl.since ?>" >
<td colspan="12">
<?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
<div id="inherited-constants-<?cs var:cl.qualified ?>">
<div id="inherited-constants-<?cs var:cl.qualified ?>-list"
class="jd-inheritedlinks">
</div>
<div id="inherited-constants-<?cs var:cl.qualified ?>-summary" style="display: none;">
<table class="jd-sumtable-expando">
<?cs call:write_constant_summary(cl.constants, cl.included) ?></table>
</div>
</div>
</td></tr>
<?cs /if ?>
<?cs /each ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.fields) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== FIELD SUMMARY =========== -->
<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr>
<?cs call:write_field_summary(class.fields, 1) ?>
</table>
<?cs /if ?>
<?cs # if there are inherited fields, write the table ?>
<?cs if:inhfields ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- =========== FIELD SUMMARY =========== -->
<table id="inhfields" class="jd-sumtable"><tr><th>
<a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
<div style="clear:left;">Inherited Fields</div></th></tr>
<?cs each:cl=class.inherited ?>
<?cs if:subcount(cl.fields) ?>
<tr class="api apilevel-<?cs var:cl.since ?>" >
<td colspan="12">
<?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
<div id="inherited-fields-<?cs var:cl.qualified ?>">
<div id="inherited-fields-<?cs var:cl.qualified ?>-list"
class="jd-inheritedlinks">
</div>
<div id="inherited-fields-<?cs var:cl.qualified ?>-summary" style="display: none;">
<table class="jd-sumtable-expando">
<?cs call:write_field_summary(cl.fields, cl.included) ?></table>
</div>
</div>
</td></tr>
<?cs /if ?>
<?cs /each ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.ctors.public) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
<?cs call:write_method_summary(class.ctors.public, 1) ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.ctors.protected) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<table id="proctors" class="jd-sumtable"><tr><th colspan="12">Protected Constructors</th></tr>
<?cs call:write_method_summary(class.ctors.protected, 1) ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.methods.public) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========== METHOD SUMMARY =========== -->
<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
<?cs call:write_method_summary(class.methods.public, 1) ?>
</table>
<?cs /if ?>
<?cs if:subcount(class.methods.protected) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========== METHOD SUMMARY =========== -->
<table id="promethods" class="jd-sumtable"><tr><th colspan="12">Protected Methods</th></tr>
<?cs call:write_method_summary(class.methods.protected, 1) ?>
</table>
<?cs /if ?>
<?cs # if there are inherited methods, write the table ?>
<?cs if:inhmethods ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========== METHOD SUMMARY =========== -->
<table id="inhmethods" class="jd-sumtable"><tr><th>
<a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
<div style="clear:left;">Inherited Methods</div></th></tr>
<?cs each:cl=class.inherited ?>
<?cs if:subcount(cl.methods) ?>
<tr class="api apilevel-<?cs var:cl.since ?>" >
<td colspan="12"><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?>
From <?cs var:cl.kind ?>
<?cs if:cl.included ?>
<a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
<?cs elif:cl.federated ?>
<a href="<?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
<?cs else ?>
<?cs var:cl.qualified ?>
<?cs /if ?>
<div id="inherited-methods-<?cs var:cl.qualified ?>">
<div id="inherited-methods-<?cs var:cl.qualified ?>-list"
class="jd-inheritedlinks">
</div>
<div id="inherited-methods-<?cs var:cl.qualified ?>-summary" style="display: none;">
<table class="jd-sumtable-expando">
<?cs call:write_method_summary(cl.methods, cl.included) ?></table>
</div>
</div>
</td></tr>
<?cs /if ?>
<?cs /each ?>
</table>
<?cs /if ?>
<?cs /if ?>
</div><!-- jd-descr (summary) -->
<!-- Details -->
<?cs def:write_field_details(fields) ?>
<?cs each:field=fields ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
<A NAME="<?cs var:field.anchor ?>"></A>
<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
<div class="jd-details api apilevel-<?cs var:field.since ?>">
<h4 class="jd-details-title">
<span class="normal">
<?cs var:field.scope ?>
<?cs var:field.static ?>
<?cs var:field.final ?>
<?cs call:type_link(field.type) ?>
</span>
<?cs var:field.name ?>
</h4>
<div class="api-level">
<?cs call:since_tags(field) ?>
<?cs call:federated_refs(field) ?>
</div>
<div class="jd-details-descr">
<?cs call:show_annotations_list(field) ?>
<?cs call:description(field) ?>
<?cs if:subcount(field.constantValue) ?>
<div class="jd-tagdata">
<span class="jd-tagtitle">Constant Value: </span>
<span>
<?cs if:field.constantValue.isString ?>
<?cs var:field.constantValue.str ?>
<?cs else ?>
<?cs var:field.constantValue.dec ?>
(<?cs var:field.constantValue.hex ?>)
<?cs /if ?>
</span>
</div>
<?cs /if ?>
</div>
</div>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_method_details(methods) ?>
<?cs each:method=methods ?>
<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
<A NAME="<?cs var:method.anchor ?>"></A>
<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
<div class="jd-details api apilevel-<?cs var:method.since ?>">
<h4 class="jd-details-title">
<span class="normal">
<?cs var:method.scope ?>
<?cs var:method.static ?>
<?cs var:method.final ?>
<?cs var:method.abstract ?>
<?cs var:method.synchronized ?>
<?cs call:type_link(method.returnType) ?>
</span>
<span class="sympad"><?cs var:method.name ?></span>
<span class="normal">(<?cs call:parameter_list(method.params) ?>)</span>
</h4>
<div class="api-level">
<div><?cs call:since_tags(method) ?></div>
<?cs call:federated_refs(method) ?>
</div>
<div class="jd-details-descr">
<?cs call:show_annotations_list(method) ?>
<?cs call:description(method) ?>
</div>
</div>
<?cs /each ?>
<?cs /def ?>
<?cs def:write_attr_details(attrs) ?>
<?cs each:attr=attrs ?>
<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
<A NAME="<?cs var:attr.anchor ?>"></A>
<div class="jd-details">
<h4 class="jd-details-title"><?cs var:attr.name ?>
</h4>
<div class="jd-details-descr">
<?cs call:show_annotations_list(attr) ?>
<?cs call:description(attr) ?>
<div class="jd-tagdata">
<h5 class="jd-tagtitle">Related Methods</h5>
<ul class="nolist">
<?cs each:m=attr.methods ?>
<li><a href="<?cs var:toroot ?><?cs var:m.href ?>"><?cs var:m.name ?></a></li>
<?cs /each ?>
</ul>
</div>
</div>
</div>
<?cs /each ?>
<?cs /def ?>
<!-- XML Attributes -->
<?cs if:subcount(class.attrs) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= FIELD DETAIL ======== -->
<h2>XML Attributes</h2>
<?cs call:write_attr_details(class.attrs) ?>
<?cs /if ?>
<!-- Enum Values -->
<?cs if:subcount(class.enumConstants) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= ENUM CONSTANTS DETAIL ======== -->
<h2>Enum Values</h2>
<?cs call:write_field_details(class.enumConstants) ?>
<?cs /if ?>
<!-- Constants -->
<?cs if:subcount(class.constants) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= ENUM CONSTANTS DETAIL ======== -->
<h2>Constants</h2>
<?cs call:write_field_details(class.constants) ?>
<?cs /if ?>
<!-- Fields -->
<?cs if:subcount(class.fields) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= FIELD DETAIL ======== -->
<h2>Fields</h2>
<?cs call:write_field_details(class.fields) ?>
<?cs /if ?>
<!-- Public ctors -->
<?cs if:subcount(class.ctors.public) ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<h2>Public Constructors</h2>
<?cs call:write_method_details(class.ctors.public) ?>
<?cs /if ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<!-- Protected ctors -->
<?cs if:subcount(class.ctors.protected) ?>
<h2>Protected Constructors</h2>
<?cs call:write_method_details(class.ctors.protected) ?>
<?cs /if ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= METHOD DETAIL ======== -->
<!-- Public methdos -->
<?cs if:subcount(class.methods.public) ?>
<h2>Public Methods</h2>
<?cs call:write_method_details(class.methods.public) ?>
<?cs /if ?>
<?cs # this next line must be exactly like this to be parsed by eclipse ?>
<!-- ========= METHOD DETAIL ======== -->
<?cs if:subcount(class.methods.protected) ?>
<h2>Protected Methods</h2>
<?cs call:write_method_details(class.methods.protected) ?>
<?cs /if ?>
<?cs # the next two lines must be exactly like this to be parsed by eclipse ?>
<!-- ========= END OF CLASS DATA ========= -->
<A NAME="navbar_top"></A>
<?cs include:"footer.cs" ?>
</div> <!-- jd-content -->
</div><!-- end doc-content -->
<?cs include:"trailer.cs" ?>
</body>
</html>

View File

@@ -1,53 +0,0 @@
<?cs include:"doctype.cs" ?>
<?cs include:"macros.cs" ?>
<?cs include:"macros_override.cs" ?>
<html<?cs if:devsite ?> devsite<?cs /if ?>>
<?cs include:"head_tag.cs" ?>
<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
<?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
if:reference ?> reference<?cs
/if ?><?cs
elif:design ?>design<?cs
elif:distribute ?>distribute<?cs
/if ?>" itemscope itemtype="http://schema.org/Article">
<a name="top"></a>
<?cs include:"header.cs" ?>
<div class="col-12" id="doc-col">
<div id="jd-header">
<h1><?cs var:page.title ?></h1>
</div>
<div id="jd-content">
<p>These are the LineageOS Platform API classes. See all <a href="packages.html">API packages</a>.</p>
<div class="jd-letterlist"><?cs each:letter=docs.classes ?>
<a href="#letter_<?cs name:letter ?>"><?cs name:letter ?></a>&nbsp;&nbsp;<?cs /each?>
</div>
<?cs each:letter=docs.classes ?>
<?cs set:count = #1 ?>
<h2 id="letter_<?cs name:letter ?>"><?cs name:letter ?></h2>
<table class="jd-sumtable">
<?cs set:cur_row = #0 ?>
<?cs each:cl = letter ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
<td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(cl) ?>&nbsp;
<?cs call:show_annotations_list(cl) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
</table>
<?cs /each ?>
<?cs include:"footer.cs" ?>
</div><!-- end jd-content -->
</div><!-- end doc-content -->
<?cs include:"trailer.cs" ?>
</body>
</html>

View File

@@ -1,10 +0,0 @@
<?cs def:custom_masthead() ?>
<div id="header">
<div id="headerLeft">
<a href="<?cs var:toroot ?>reference/packages.html" tabindex="-1"><img
src="<?cs var:toroot ?>assets/lineage_logo.svg" alt="CID" width="144" height="72"/>
<span id="masthead-title" style="font-size: 28px;">LineageOS Platform SDK</span></a>
</div>
</div><!-- header --><?cs
/def ?>

View File

@@ -1,516 +0,0 @@
<?cs
def:fullpage() ?>
<div id="body-content">
<?cs /def ?>
<?cs
def:sdk_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<?cs /def ?><?cs
def:no_nav() ?>
<div class="wrap clearfix" id="body-content">
<?cs /def ?><?cs
def:tools_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:training_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:googleplay_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:essentials_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:users_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:engage_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:analyze_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:monetize_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:disttools_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:stories_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?><?cs
def:guide_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:design_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:distribute_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/distribute/distribute_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:samples_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:google_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
</div>
<script type="text/javascript">
showGoogleRefTree();
</script>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:about_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:wear_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/wear/wear_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs
def:preview_nav() ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav" class="scroll-pane">
<?cs
include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
$(document).ready(function() {
scrollIntoView("devdoc-nav");
});
</script>
<?cs /def ?>
<?cs # The default side navigation for the reference docs ?><?cs
def:default_left_nav() ?>
<?cs if:reference.gcm || reference.gms ?>
<?cs call:google_nav() ?>
<?cs else ?>
<div class="wrap clearfix" id="body-content">
<div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav">
<div id="api-nav-header">
<div id="api-level-toggle">
<label for="apiLevelCheckbox" class="disabled"
title="Select your target API level to dim unavailable APIs">API level: </label>
<div class="select-wrapper">
<select id="apiLevelSelector">
<!-- option elements added by buildApiLevelSelector() -->
</select>
</div>
</div><!-- end toggle -->
<div id="api-nav-title">LineageOS APIs</div>
</div><!-- end nav header -->
<script>
var SINCE_DATA = [ <?cs
each:since = since ?>'<?cs
var:since.name ?>'<?cs
if:!last(since) ?>, <?cs /if ?><?cs
/each
?> ];
buildApiLevelSelector();
</script>
<div id="swapper">
<div id="nav-panels">
<div id="resize-packages-nav">
<div id="packages-nav" class="scroll-pane">
<ul>
<?cs call:package_link_list(docs.packages) ?>
</ul><br/>
</div> <!-- end packages-nav -->
</div> <!-- end resize-packages -->
<div id="classes-nav" class="scroll-pane">
<?cs
if:subcount(class.package) ?>
<ul>
<?cs call:list("Annotations", class.package.annotations) ?>
<?cs call:list("Interfaces", class.package.interfaces) ?>
<?cs call:list("Classes", class.package.classes) ?>
<?cs call:list("Enums", class.package.enums) ?>
<?cs call:list("Exceptions", class.package.exceptions) ?>
<?cs call:list("Errors", class.package.errors) ?>
</ul><?cs
elif:subcount(package) ?>
<ul>
<?cs call:class_link_list("Annotations", package.annotations) ?>
<?cs call:class_link_list("Interfaces", package.interfaces) ?>
<?cs call:class_link_list("Classes", package.classes) ?>
<?cs call:class_link_list("Enums", package.enums) ?>
<?cs call:class_link_list("Exceptions", package.exceptions) ?>
<?cs call:class_link_list("Errors", package.errors) ?>
</ul><?cs
else ?>
<p style="padding:10px">Select a package to view its members</p><?cs
/if ?><br/>
</div><!-- end classes -->
</div><!-- end nav-panels -->
<div id="nav-tree" style="display:none" class="scroll-pane">
<div id="tree-list"></div>
</div><!-- end nav-tree -->
</div><!-- end swapper -->
<div id="nav-swap">
<a class="fullscreen">fullscreen</a>
<a href='#' onclick='swapNav();return false;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a>
</div>
</div> <!-- end devdoc-nav -->
</div> <!-- end side-nav -->
<script type="text/javascript">
// init fullscreen based on user pref
var fullscreen = readCookie("fullscreen");
if (fullscreen != 0) {
if (fullscreen == "false") {
toggleFullscreen(false);
} else {
toggleFullscreen(true);
}
}
// init nav version for mobile
if (isMobile) {
swapNav(); // tree view should be used on mobile
$('#nav-swap').hide();
} else {
chooseDefaultNav();
if ($("#nav-tree").is(':visible')) {
init_default_navtree("<?cs var:toroot ?>");
}
}
// scroll the selected page into view
$(document).ready(function() {
scrollIntoView("packages-nav");
scrollIntoView("classes-nav");
});
</script>
<?cs /if ?>
<?cs
/def ?>
<?cs
def:custom_left_nav() ?><?cs
if:fullpage ?><?cs
call:fullpage() ?><?cs
elif:nonavpage ?><?cs
call:no_nav() ?><?cs
elif:guide ?><?cs
call:guide_nav() ?><?cs
elif:design ?><?cs
call:design_nav() ?><?cs
elif:training ?><?cs
call:training_nav() ?><?cs
elif:tools ?><?cs
call:tools_nav() ?><?cs
elif:google ?><?cs
call:google_nav() ?><?cs
elif:samples ?><?cs
call:samples_nav() ?><?cs
elif:distribute ?><?cs
if:googleplay ?><?cs
call:googleplay_nav() ?><?cs
elif:essentials ?><?cs
call:essentials_nav() ?><?cs
elif:users ?><?cs
call:users_nav() ?><?cs
elif:engage ?><?cs
call:engage_nav() ?><?cs
elif:monetize ?><?cs
call:monetize_nav() ?><?cs
elif:analyze ?><?cs
call:analyze_nav() ?><?cs
elif:disttools ?><?cs
call:disttools_nav() ?><?cs
elif:stories ?><?cs
call:stories_nav() ?><?cs
/if ?><?cs
elif:about ?><?cs
call:about_nav() ?><?cs
elif:distribute ?><?cs
call:distribute_nav() ?><?cs
elif:wear ?><?cs
call:wear_nav() ?><?cs
elif:preview ?><?cs
call:preview_nav() ?><?cs
else ?><?cs
call:default_left_nav() ?> <?cs
/if ?><?cs
/def ?>
<?cs # appears at the bottom of every page ?><?cs
def:custom_cc_copyright() ?>
Except as noted, this content is
licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
Creative Commons Attribution 2.5</a>. For details and
restrictions, see the <a href="<?cs var:toroot ?>license.html">Content
License</a>.<?cs
/def ?>
<?cs
def:custom_copyright() ?>
Except as noted, this content is licensed under <a
href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
For details and restrictions, see the <a href="<?cs var:toroot ?>license.html">
Content License</a>.<?cs
/def ?>
<?cs
def:custom_footerlinks() ?>
<p>
<a href="<?cs var:toroot ?>about/index.html">About Android</a>&nbsp;&nbsp;|&nbsp;
<a href="<?cs var:toroot ?>legal.html">Legal</a>&nbsp;&nbsp;|&nbsp;
<a href="<?cs var:toroot ?>support.html">Support</a>
</p><?cs
/def ?>
<?cs # appears on the right side of the blue bar at the bottom off every page ?><?cs
def:custom_buildinfo() ?><?cs
if:!google && !reference.gcm && !reference.gms ?>
Android <?cs var:sdk.version ?>&nbsp;r<?cs var:sdk.rel.id ?> &mdash; <?cs
/if ?>
<script src="<?cs var:toroot ?>timestamp.js" type="text/javascript"></script>
<script>document.write(BUILD_TIMESTAMP)</script>
<?cs /def ?>

View File

@@ -1,87 +0,0 @@
<head>
<?cs
####### If building devsite, add some meta data needed for when generating the top nav ######### ?>
<?cs
if:devsite ?><?cs
if:guide||develop||training||reference||tools||sdk||google||samples
?><meta name="top_category" value="develop" /><?cs
elif:google
?><meta name="top_category" value="google" /><?cs
elif:reference && !(reference.gms || reference.gcm)
?><meta name="top_category" value="css-fullscreen" /><?cs
/if ?>
<?cs
/if
?><?cs
# END if/else devsite ?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=<?cs
if:page.viewport_width ?><?cs
var:page.viewport_width ?><?cs
else ?>device-width<?cs /if ?>" />
<?cs
if:page.metaDescription ?>
<meta name="Description" content="<?cs var:page.metaDescription ?>"><?cs
/if ?>
<link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>assets/favicon.ico" />
<title><?cs
if:page.title ?><?cs
var:page.title ?> | <?cs
/if ?>Android Developers</title>
<!-- STYLESHEETS -->
<link rel="stylesheet"
href="<?cs
if:android.whichdoc != 'online' ?>http:<?cs
/if ?>//fonts.googleapis.com/css?family=Roboto+Condensed">
<link rel="stylesheet" href="<?cs
if:android.whichdoc != 'online' ?>http:<?cs
/if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
title="roboto">
<link href="<?cs var:toroot ?>assets/css/default.css?v=5" rel="stylesheet" type="text/css">
<?cs if:reference && !(reference.gms || reference.gcm || preview) ?>
<!-- FULLSCREEN STYLESHEET -->
<link href="<?cs var:toroot ?>assets/css/fullscreen.css" rel="stylesheet" class="fullscreen"
type="text/css">
<?cs /if ?>
<!-- JAVASCRIPT -->
<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script>
<?cs
if:devsite
?><script src="<?cs var:toroot ?>_static/js/android_3p-bundle.js" type="text/javascript"></script><?cs
else
?><script src="<?cs var:toroot ?>assets/js/android_3p-bundle.js" type="text/javascript"></script><?cs
/if ?><?cs
if:page.customHeadTag ?>
<?cs var:page.customHeadTag ?><?cs
/if ?>
<script type="text/javascript">
var toRoot = "<?cs var:toroot ?>";
var metaTags = [<?cs var:meta.tags ?>];
var devsite = <?cs if:devsite ?>true<?cs else ?>false<?cs /if ?>;
</script>
<?cs if:helpoutsWidget ?>
<script type="text/javascript" src="https://helpouts.google.com/ps/res/embed.js" defer async
data-helpouts-embed data-helpouts-vertical="programming"
data-helpouts-tags="<?cs var:page.tags ?>" data-helpouts-prefix="android"
data-helpouts-standalone="true"></script>
<?cs /if ?>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-5831155-1', 'android.com');
ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'}); // New tracker);
ga('send', 'pageview');
ga('universal.send', 'pageview'); // Send page view for new tracker.
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="<?cs var:toroot ?>assets/docs.js?v=3" type="text/javascript"></script>
</head>

View File

@@ -1,36 +0,0 @@
<?cs # Create a comma separated list of annotations on obj that were in showAnnotations in Doclava ?>
<?cs # pre is an HTML string to start the list, post is an HTML string to close the list ?>
<?cs # for example call:show_annotations_list(cl, "<td>Annotations: ", "</td>") ?>
<?cs # if obj has nothing on obj.showAnnotations, nothing will be output ?>
<?cs def:show_annotations_list(obj) ?>
<?cs each:anno = obj.showAnnotations ?>
<?cs if:first(anno) ?>
<span class='annotation-message'>
Included in documentation by the annotations:
<?cs /if ?>
@<?cs var:anno.type.label ?>
<?cs if:last(anno) == 0 ?>
, &nbsp;
<?cs /if ?>
<?cs if:last(anno)?>
</span>
<?cs /if ?>
<?cs /each ?>
<?cs /def ?>
<?cs # Override default class_link_table to display annotations ?>
<?cs def:class_link_table(classes) ?>
<?cs set:count = #1 ?>
<table class="jd-sumtable-expando">
<?cs each:cl=classes ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.type.since ?>" >
<td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
<td class="jd-descrcol" width="100%">
<?cs call:short_descr(cl) ?>&nbsp;
<?cs call:show_annotations_list(cl) ?>
</td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
</table>
<?cs /def ?>

View File

@@ -1,65 +0,0 @@
<?cs include:"doctype.cs" ?>
<?cs include:"macros.cs" ?>
<?cs include:"macros_override.cs" ?>
<html<?cs if:devsite ?> devsite<?cs /if ?>>
<?cs include:"head_tag.cs" ?>
<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
<?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
if:reference ?> reference<?cs
/if ?><?cs
elif:design ?>design<?cs
elif:distribute ?>distribute<?cs
/if ?>">
<div id="doc-api-level" class="<?cs var:package.since ?>" style="display:none"></div>
<a name="top"></a>
<?cs include:"header.cs" ?>
<div class="col-12" id="doc-col">
<div id="api-info-block">
<div class="api-level">
<?cs call:since_tags(package) ?>
<?cs call:federated_refs(package) ?>
</div>
</div>
<div id="jd-header">
package
<h1><?cs var:package.name ?></h1>
</div><!-- end header -->
<div id="naMessage"></div>
<div id="jd-content" class="api apilevel-<?cs var:package.since ?>">
<?cs if:subcount(package.descr) ?>
<div class="jd-descr">
<?cs call:tag_list(package.descr) ?>
</div>
<?cs /if ?>
<?cs def:class_table(label, classes) ?>
<?cs if:subcount(classes) ?>
<h2><?cs var:label ?></h2>
<div class="jd-sumtable">
<?cs call:class_link_table(classes) ?>
</div>
<?cs /if ?>
<?cs /def ?>
<?cs call:class_table("Annotations", package.annotations) ?>
<?cs call:class_table("Interfaces", package.interfaces) ?>
<?cs call:class_table("Classes", package.classes) ?>
<?cs call:class_table("Enums", package.enums) ?>
<?cs call:class_table("Exceptions", package.exceptions) ?>
<?cs call:class_table("Errors", package.errors) ?>
<?cs include:"footer.cs" ?>
</div><!-- end jd-content -->
</div><!-- doc-content -->
<?cs include:"trailer.cs" ?>
</body>
</html>

View File

@@ -1,45 +0,0 @@
<?cs include:"doctype.cs" ?>
<?cs include:"macros.cs" ?>
<html<?cs if:devsite ?> devsite<?cs /if ?>>
<?cs include:"head_tag.cs" ?>
<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
<?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
if:reference ?> reference<?cs
/if ?><?cs
elif:design ?>design<?cs
elif:distribute ?>distribute<?cs
/if ?>">
<a name="top"></a>
<?cs include:"header.cs" ?>
<div class="col-12" id="doc-col">
<div id="jd-header">
<h1><?cs var:page.title ?></h1>
</div>
<div id="jd-content">
<div class="jd-descr">
<p><?cs call:tag_list(root.descr) ?></p>
</div>
<?cs set:count = #1 ?>
<table class="jd-sumtable">
<?cs each:pkg = docs.packages ?>
<tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:pkg.since ?>" >
<td class="jd-linkcol"><?cs call:package_link(pkg) ?></td>
<td class="jd-descrcol" width="100%"><?cs call:tag_list(pkg.shortDescr) ?></td>
</tr>
<?cs set:count = count + #1 ?>
<?cs /each ?>
</table>
<?cs include:"footer.cs" ?>
</div><!-- end jd-content -->
</div> <!-- end doc-content -->
<?cs include:"trailer.cs" ?>
</body>
</html>

View File

@@ -1 +0,0 @@
var BUILD_TIMESTAMP = "<?cs var:page.now ?>";

View File

@@ -1,754 +0,0 @@
#!/usr/bin/env python3
#
# Copyright (C) 2013-2015 The CyanogenMod Project
# (C) 2017-2025 The LineageOS 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.
#
#
# Run repopick.py -h for a description of this utility.
#
import argparse
import json
import os
import re
import subprocess
import sys
import textwrap
import urllib.parse
import urllib.request
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor
from functools import cmp_to_key, partial
from xml.etree import ElementTree
# cmp() is not available in Python 3, define it manually
# See https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
def cmp(a, b):
return (a > b) - (a < b)
# Verifies whether pathA is a subdirectory (or the same) as pathB
def is_subdir(a, b):
a = os.path.realpath(a) + "/"
b = os.path.realpath(b) + "/"
return b == a[: len(b)]
def fetch_query_via_ssh(remote_url, query):
"""Given a remote_url and a query, return the list of changes that fit it
This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API
We have to get the data, then transform it to match what we're expecting from the HTTP RESET API
"""
if remote_url.count(":") == 2:
(_, userhost, port) = remote_url.split(":")
userhost = userhost[2:]
elif remote_url.count(":") == 1:
(_, userhost) = remote_url.split(":")
userhost = userhost[2:]
port = "29418"
else:
raise Exception("Malformed URI: Expecting ssh://[user@]host[:port]")
out = subprocess.check_output(
[
"ssh",
"-x",
"-p",
port,
userhost,
"gerrit",
"query",
"--format",
"JSON",
"--patch-sets",
"--current-patch-set",
query,
],
text=True,
)
reviews = []
for line in out.split("\n"):
try:
data = json.loads(line)
# make our data look like the http rest api data
review = {
"branch": data["branch"],
"change_id": data["id"],
"current_revision": data["currentPatchSet"]["revision"],
"number": int(data["number"]),
"revisions": {
patch_set["revision"]: {
"_number": int(patch_set["number"]),
"fetch": {
"ssh": {
"ref": patch_set["ref"],
"url": "ssh://{0}:{1}/{2}".format(
userhost, port, data["project"]
),
}
},
"commit": {
"parents": [
{"commit": parent} for parent in patch_set["parents"]
]
},
}
for patch_set in data["patchSets"]
},
"subject": data["subject"],
"project": data["project"],
"status": data["status"],
}
reviews.append(review)
except Exception:
pass
return reviews
def build_query_url(remote_url, query, auth, start=0):
p = urllib.parse.urlparse(remote_url)._asdict()
p["path"] = ("/a" if auth else "") + "/changes"
p["query"] = urllib.parse.urlencode(
{
"q": query,
"o": ["CURRENT_REVISION", "ALL_REVISIONS", "ALL_COMMITS"],
"start": start,
},
doseq=True,
)
return urllib.parse.unquote(urllib.parse.urlunparse(urllib.parse.ParseResult(**p)))
def fetch_query_via_http(remote_url, query, auth=True, start=0):
"""Given a query, fetch the change numbers via http"""
all_reviews = []
start_index = start
has_more_changes = True
username = password = ""
if auth:
gerritrc = os.path.expanduser("~/.gerritrc")
if os.path.isfile(gerritrc):
with open(gerritrc, "r") as f:
for line in f:
parts = line.rstrip().split("|")
if parts[0] in remote_url:
username, password = parts[1], parts[2]
while has_more_changes:
if auth:
if username and password:
url = build_query_url(remote_url, query, auth, start_index)
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, url, username, password)
auth_handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
if response.getcode() != 200:
# They didn't get good authorization or data, Let's try the old way
return fetch_query_via_http(remote_url, query, False, start_index)
else:
return fetch_query_via_http(remote_url, query, False, start_index)
else:
url = build_query_url(remote_url, query, auth, start_index)
response = urllib.request.urlopen(url)
data = response.read().decode("utf-8")
reviews = json.loads(data[5:])
for review in reviews:
review["number"] = review.pop("_number")
all_reviews.extend(reviews)
if not reviews[-1].get("_more_changes"):
has_more_changes = False
start_index += len(reviews)
return all_reviews
def fetch_query(remote_url, query):
"""Wrapper for fetch_query_via_proto functions"""
if remote_url[0:3] == "ssh":
return fetch_query_via_ssh(remote_url, query)
elif remote_url[0:4] == "http":
return fetch_query_via_http(remote_url, query)
else:
raise Exception(
"Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]"
)
def is_closed(status):
return status not in ("OPEN", "NEW", "DRAFT")
def is_lineage_gerrit(remote_url):
p = urllib.parse.urlparse(remote_url)
return p.hostname == "review.lineageos.org"
def commit_exists(project_path, revision):
return (
subprocess.call(
["git", "cat-file", "-e", revision],
cwd=project_path,
stderr=subprocess.DEVNULL,
)
== 0
)
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description=textwrap.dedent(
"""\
repopick.py is a utility to simplify the process of cherry picking
patches from LineageOS's Gerrit instance (or any gerrit instance of your choosing)
Given a list of change numbers, repopick will cd into the project path
and cherry pick the latest patch available.
With the --start-branch argument, the user can specify that a branch
should be created before cherry picking. This is useful for
cherry-picking many patches into a common branch which can be easily
abandoned later (good for testing other's changes.)
The --abandon-first argument, when used in conjunction with the
--start-branch option, will cause repopick to abandon the specified
branch in all repos first before performing any cherry picks."""
),
)
parser.add_argument(
"change_number",
nargs="*",
help="change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.",
)
parser.add_argument(
"-i",
"--ignore-missing",
action="store_true",
help="do not error out if a patch applies to a missing directory",
)
parser.add_argument(
"-s",
"--start-branch",
nargs=1,
metavar="",
help="start the specified branch before cherry picking",
)
parser.add_argument(
"-r",
"--reset",
action="store_true",
help="reset to initial state (abort cherry-pick) if there is a conflict",
)
parser.add_argument(
"-a",
"--abandon-first",
action="store_true",
help="before cherry picking, abandon the branch specified in --start-branch",
)
parser.add_argument(
"-b",
"--auto-branch",
action="store_true",
help='shortcut to "--start-branch auto --abandon-first --ignore-missing"',
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
"-q", "--quiet", action="store_true", help="print as little as possible"
)
group.add_argument(
"-v",
"--verbose",
action="store_true",
help="print extra information to aid in debug",
)
parser.add_argument(
"-f",
"--force",
action="store_true",
help="force cherry pick even if change is closed",
)
parser.add_argument(
"-p", "--pull", action="store_true", help="execute pull instead of cherry-pick"
)
parser.add_argument(
"-P", "--path", metavar="", help="use the specified path for the change"
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
"-t", "--topic", metavar="", help="pick all commits from a specified topic"
)
group.add_argument(
"-H", "--hashtag", metavar="", help="pick all commits from a specified hashtag"
)
group.add_argument(
"-Q", "--query", metavar="", help="pick all commits using the specified query"
)
parser.add_argument(
"-g",
"--gerrit",
default="https://review.lineageos.org",
metavar="",
help="Gerrit Instance to use. Form proto://[user@]host[:port]",
)
parser.add_argument(
"-e",
"--exclude",
nargs=1,
metavar="",
help="exclude a list of commit numbers separated by a ,",
)
parser.add_argument(
"-c",
"--check-picked",
type=int,
default=10,
metavar="",
help="pass the amount of commits to check for already picked changes",
)
parser.add_argument(
"-j",
"--jobs",
type=int,
default=4,
metavar="",
help="max number of changes to pick in parallel",
)
args = parser.parse_args()
if not args.start_branch and args.abandon_first:
parser.error(
"if --abandon-first is set, you must also give the branch name with --start-branch"
)
if args.auto_branch:
args.abandon_first = True
args.ignore_missing = True
if not args.start_branch:
args.start_branch = ["auto"]
# Change current directory to the top of the tree
if "ANDROID_BUILD_TOP" in os.environ:
top = os.environ["ANDROID_BUILD_TOP"]
if not is_subdir(os.getcwd(), top):
sys.stderr.write(
"ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n"
)
sys.exit(1)
os.chdir(os.environ["ANDROID_BUILD_TOP"])
# Sanity check that we are being run from the top level of the tree
if not os.path.isdir(".repo"):
sys.stderr.write(
"ERROR: No .repo directory found. Please run this from the top of your tree.\n"
)
sys.exit(1)
# If --abandon-first is given, abandon the branch before starting
if args.abandon_first:
# Determine if the branch already exists; skip the abandon if it does not
plist = subprocess.check_output(["repo", "info"], text=True)
needs_abandon = False
for pline in plist.splitlines():
matchObj = re.match(r"Local Branches.*\[(.*)\]", pline)
if matchObj:
local_branches = re.split(r"\s*,\s*", matchObj.group(1))
if any(args.start_branch[0] in s for s in local_branches):
needs_abandon = True
if needs_abandon:
# Perform the abandon only if the branch already exists
if not args.quiet:
print("Abandoning branch: %s" % args.start_branch[0])
subprocess.run(["repo", "abandon", args.start_branch[0]])
if not args.quiet:
print("")
# Get the main manifest from repo
# - convert project name and revision to a path
project_name_to_data = {}
manifest = subprocess.check_output(["repo", "manifest"], text=True)
xml_root = ElementTree.fromstring(manifest)
projects = xml_root.findall("project")
remotes = xml_root.findall("remote")
default_revision = xml_root.findall("default")[0].get("revision")
if not default_revision:
raise ValueError("Failed to get revision from manifest")
# dump project data into the a list of dicts with the following data:
# {project: {path, revision}}
for project in projects:
name = project.get("name")
# when name and path are equal, "repo manifest" doesn't return a path at all, so fall back to name
path = project.get("path", name)
revision = project.get("upstream")
if revision is None:
for remote in remotes:
if remote.get("name") == project.get("remote"):
revision = remote.get("revision")
if revision is None:
revision = project.get("revision", default_revision)
if name not in project_name_to_data:
project_name_to_data[name] = {}
revision = revision.split("refs/heads/")[-1]
project_name_to_data[name][revision] = path
def cmp_reviews(review_a, review_b):
current_a = review_a["current_revision"]
parents_a = [
r["commit"] for r in review_a["revisions"][current_a]["commit"]["parents"]
]
current_b = review_b["current_revision"]
parents_b = [
r["commit"] for r in review_b["revisions"][current_b]["commit"]["parents"]
]
if current_a in parents_b:
return -1
elif current_b in parents_a:
return 1
else:
return cmp(review_a["number"], review_b["number"])
# get data on requested changes
if args.topic:
reviews = fetch_query(args.gerrit, "topic:{0}".format(args.topic))
change_numbers = [
str(r["number"]) for r in sorted(reviews, key=cmp_to_key(cmp_reviews))
]
elif args.hashtag:
reviews = fetch_query(args.gerrit, "hashtag:{0}".format(args.hashtag))
change_numbers = [
str(r["number"]) for r in sorted(reviews, key=cmp_to_key(cmp_reviews))
]
elif args.query:
reviews = fetch_query(args.gerrit, args.query)
change_numbers = [
str(r["number"]) for r in sorted(reviews, key=cmp_to_key(cmp_reviews))
]
else:
change_url_re = re.compile(r"https?://.+?/([0-9]+(?:/[0-9]+)?)/?")
change_numbers = []
for c in args.change_number:
change_number = change_url_re.findall(c)
if change_number:
change_numbers.extend(change_number)
elif "-" in c:
templist = c.split("-")
for i in range(int(templist[0]), int(templist[1]) + 1):
change_numbers.append(str(i))
else:
change_numbers.append(c)
reviews = fetch_query(
args.gerrit,
" OR ".join("change:{0}".format(x.split("/")[0]) for x in change_numbers),
)
# make list of things to actually merge
mergables = defaultdict(list)
# If --exclude is given, create the list of commits to ignore
exclude = []
if args.exclude:
exclude = args.exclude[0].split(",")
for change in change_numbers:
patchset = None
if "/" in change:
(change, patchset) = change.split("/")
if change in exclude:
continue
change = int(change)
if patchset:
patchset = int(patchset)
review = next((x for x in reviews if x["number"] == change), None)
if review is None:
print("Change %d not found, skipping" % change)
continue
# Check if change is open and exit if it's not, unless -f is specified
if is_closed(review["status"]) and not args.force:
print(
"Change {} status is {}. Skipping the cherry pick.\nUse -f to force this pick.".format(
change, review["status"]
)
)
continue
# Convert the project name to a project path
# - check that the project path exists
if (
review["project"] in project_name_to_data
and review["branch"] in project_name_to_data[review["project"]]
):
project_path = project_name_to_data[review["project"]][review["branch"]]
elif args.path:
project_path = args.path
elif (
review["project"] in project_name_to_data
and len(project_name_to_data[review["project"]]) == 1
):
local_branch = list(project_name_to_data[review["project"]])[0]
project_path = project_name_to_data[review["project"]][local_branch]
print(
'WARNING: Project {0} has a different branch ("{1}" != "{2}")'.format(
project_path, local_branch, review["branch"]
)
)
elif args.ignore_missing:
print(
"WARNING: Skipping {0} since there is no project directory for: {1}\n".format(
review["number"], review["project"]
)
)
continue
else:
sys.stderr.write(
"ERROR: For {0}, could not determine the project path for project {1}\n".format(
review["number"], review["project"]
)
)
sys.exit(1)
item = {
"subject": review["subject"],
"project_path": project_path,
"branch": review["branch"],
"change_id": review["change_id"],
"change_number": review["number"],
"status": review["status"],
"patchset": review["revisions"][review["current_revision"]]["_number"],
"fetch": review["revisions"][review["current_revision"]]["fetch"],
"id": change,
"revision": review["current_revision"],
}
if patchset:
for x in review["revisions"]:
if review["revisions"][x]["_number"] == patchset:
item["fetch"] = review["revisions"][x]["fetch"]
item["id"] = "{0}/{1}".format(change, patchset)
item["patchset"] = patchset
item["revision"] = x
break
else:
if not args.quiet:
print(
"ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.".format(
change, patchset
)
)
mergables[project_path].append(item)
# round 1: start branch and drop picked changes
for project_path in mergables:
# If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully)
if args.start_branch:
subprocess.run(["repo", "start", args.start_branch[0], project_path])
# Determine the maximum commits to check already picked changes
check_picked_count = args.check_picked
branch_commits_count = int(
subprocess.check_output(
[
"git",
"rev-list",
"--count",
"--max-count",
str(check_picked_count + 1),
"HEAD",
],
cwd=project_path,
text=True,
)
)
if branch_commits_count <= check_picked_count:
check_picked_count = branch_commits_count - 1
picked_change_ids = []
for i in range(check_picked_count):
if not commit_exists(project_path, "HEAD~{0}".format(i)):
continue
output = subprocess.check_output(
["git", "show", "-q", f"HEAD~{i}"], cwd=project_path, text=True
)
output = output.split()
if "Change-Id:" in output:
for j, t in enumerate(reversed(output)):
if t == "Change-Id:":
head_change_id = output[len(output) - j]
picked_change_ids.append(head_change_id.strip())
break
def filter_picked(item):
# Check if change is already picked to HEAD...HEAD~check_picked_count
if item["change_id"] in picked_change_ids:
print(
"Skipping {0} - already picked in {1}".format(
item["id"], project_path
)
)
return False
return True
mergables[project_path] = list(filter(filter_picked, mergables[project_path]))
# round 2: fetch changes in parallel if not pull
if not args.pull:
with ThreadPoolExecutor(max_workers=args.jobs) as e:
for per_path_mergables in mergables.values():
# changes are sorted so loop in reversed order to fetch top commits first
for item in reversed(per_path_mergables):
e.submit(partial(do_git_fetch_pull, args), item)
# round 3: apply changes in parallel for different projects, but sequential
# within each project
with ThreadPoolExecutor(max_workers=args.jobs) as e:
def bulk_pick_change(per_path_mergables):
for item in per_path_mergables:
apply_change(args, item)
for per_path_mergables in mergables.values():
e.submit(bulk_pick_change, per_path_mergables)
def do_git_fetch_pull(args, item):
project_path = item["project_path"]
# commit object already exists, no need to fetch
if not args.pull and commit_exists(project_path, item["revision"]):
return
if "anonymous http" in item["fetch"]:
method = "anonymous http"
else:
method = "ssh"
if args.pull:
cmd = ["git", "pull", "--no-edit"]
else:
cmd = ["git", "fetch"]
if args.quiet:
cmd.append("--quiet")
cmd.extend(["", item["fetch"][method]["ref"]])
# Try fetching from GitHub first if using lineage gerrit
if is_lineage_gerrit(args.gerrit):
if args.verbose:
print("Trying to fetch the change from GitHub")
cmd[-2] = "github"
if not args.quiet:
print(cmd)
result = subprocess.call(cmd, cwd=project_path)
# Check if it worked
if result == 0 or commit_exists(project_path, item["revision"]):
return
print("ERROR: git command failed")
# If not using the lineage gerrit or github failed, fetch from gerrit.
if args.verbose:
if is_lineage_gerrit(args.gerrit):
print(
"Fetching from GitHub didn't work, trying to fetch the change from Gerrit"
)
else:
print("Fetching from {0}".format(args.gerrit))
cmd[-2] = item["fetch"][method]["url"]
if not args.quiet:
print(cmd)
result = subprocess.call(cmd, cwd=project_path)
if result != 0 and not commit_exists(project_path, item["revision"]):
print("ERROR: git command failed")
sys.exit(result)
def apply_change(args, item):
if not args.quiet:
print("Applying change number {0}...".format(item["id"]))
if is_closed(item["status"]):
print("!! Force-picking a closed change !!\n")
project_path = item["project_path"]
# Print out some useful info
if not args.quiet:
print('--> Subject: "{0}"'.format(item["subject"]))
print("--> Project path: {0}".format(project_path))
print(
"--> Change number: {0} (Patch Set {1})".format(
item["id"], item["patchset"]
)
)
if args.pull:
do_git_fetch_pull(args, item)
else:
# Perform the cherry-pick
if args.quiet:
cmd_out = subprocess.DEVNULL
else:
cmd_out = None
result = subprocess.call(
["git", "cherry-pick", "--ff", item["revision"]],
cwd=project_path,
stdout=cmd_out,
stderr=cmd_out,
)
if result != 0:
result = subprocess.call(
["git", "diff-index", "--quiet", "HEAD", "--"],
cwd=project_path,
stdout=cmd_out,
stderr=cmd_out,
)
if result == 0:
print(
"WARNING: git command resulted with an empty commit, aborting cherry-pick"
)
subprocess.call(
["git", "cherry-pick", "--abort"],
cwd=project_path,
stdout=cmd_out,
stderr=cmd_out,
)
elif args.reset:
print("ERROR: git command failed, aborting cherry-pick")
subprocess.call(
["git", "cherry-pick", "--abort"],
cwd=project_path,
stdout=cmd_out,
stderr=cmd_out,
)
sys.exit(result)
else:
print("ERROR: git command failed")
sys.exit(result)
if not args.quiet:
print("")
if __name__ == "__main__":
main()

View File

@@ -1,314 +0,0 @@
#!/usr/bin/env python3
# Copyright (C) 2012-2013, The CyanogenMod Project
# (C) 2017-2018,2020-2021, The LineageOS 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.
from __future__ import print_function
import glob
import json
import os
import re
import subprocess
import sys
import urllib.error
import urllib.parse
import urllib.request
from xml.etree import ElementTree
dryrun = os.getenv('ROOMSERVICE_DRYRUN') == "true"
if dryrun:
print("Dry run roomservice, no change will be made.")
product = sys.argv[1]
if len(sys.argv) > 2:
depsonly = sys.argv[2]
else:
depsonly = None
try:
device = product[product.index("_") + 1:]
except:
device = product
if not depsonly:
print("Device %s not found. Attempting to retrieve device repository from LineageOS Github (http://github.com/LineageOS)." % device)
repositories = []
if not depsonly:
githubreq = urllib.request.Request("https://raw.githubusercontent.com/LineageOS/mirror/main/default.xml")
try:
result = ElementTree.fromstring(urllib.request.urlopen(githubreq, timeout=10).read().decode())
except urllib.error.URLError:
print("Failed to fetch data from GitHub")
sys.exit(1)
except ValueError:
print("Failed to parse return data from GitHub")
sys.exit(1)
for res in result.findall('.//project'):
repositories.append(res.attrib['name'][10:])
local_manifests = r'.repo/local_manifests'
if not os.path.exists(local_manifests): os.makedirs(local_manifests)
def exists_in_tree(lm, path):
for child in lm.getchildren():
if child.attrib['path'] == path:
return True
return False
# in-place prettyprint formatter
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
def get_manifest_path():
'''Find the current manifest path
In old versions of repo this is at .repo/manifest.xml
In new versions, .repo/manifest.xml includes an include
to some arbitrary file in .repo/manifests'''
m = ElementTree.parse(".repo/manifest.xml")
try:
m.findall('default')[0]
return '.repo/manifest.xml'
except IndexError:
return ".repo/manifests/{}".format(m.find("include").get("name"))
def get_default_revision():
m = ElementTree.parse(get_manifest_path())
d = m.findall('default')[0]
r = d.get('revision')
return r.replace('refs/heads/', '').replace('refs/tags/', '')
def get_from_manifest(devicename):
for path in glob.glob(".repo/local_manifests/*.xml"):
try:
lm = ElementTree.parse(path)
lm = lm.getroot()
except:
lm = ElementTree.Element("manifest")
for localpath in lm.findall("project"):
if re.search("android_device_.*_%s$" % device, localpath.get("name")):
return localpath.get("path")
return None
def is_in_manifest(projectpath):
for path in glob.glob(".repo/local_manifests/*.xml"):
try:
lm = ElementTree.parse(path)
lm = lm.getroot()
except:
lm = ElementTree.Element("manifest")
for localpath in lm.findall("project"):
if localpath.get("path") == projectpath:
return True
# Search in main manifest, too
try:
lm = ElementTree.parse(get_manifest_path())
lm = lm.getroot()
except:
lm = ElementTree.Element("manifest")
for localpath in lm.findall("project"):
if localpath.get("path") == projectpath:
return True
# ... and don't forget the lineage snippet
try:
lm = ElementTree.parse(".repo/manifests/snippets/lineage.xml")
lm = lm.getroot()
except:
lm = ElementTree.Element("manifest")
for localpath in lm.findall("project"):
if localpath.get("path") == projectpath:
return True
return False
def add_to_manifest(repositories):
if dryrun:
return
try:
lm = ElementTree.parse(".repo/local_manifests/roomservice.xml")
lm = lm.getroot()
except:
lm = ElementTree.Element("manifest")
for repository in repositories:
repo_name = repository['repository']
repo_target = repository['target_path']
repo_revision = repository['branch']
print('Checking if %s is fetched from %s' % (repo_target, repo_name))
if is_in_manifest(repo_target):
print('LineageOS/%s already fetched to %s' % (repo_name, repo_target))
continue
project = ElementTree.Element("project", attrib = {
"path": repo_target,
"remote": "github",
"name": "LineageOS/%s" % repo_name,
"revision": repo_revision })
if repo_remote := repository.get("remote", None):
# aosp- remotes are only used for kernel prebuilts, thus they
# don't let you customize clone-depth/revision.
if repo_remote.startswith("aosp-"):
project.attrib["name"] = repo_name
project.attrib["remote"] = repo_remote
project.attrib["clone-depth"] = "1"
del project.attrib["revision"]
if project.attrib.get("revision", None) == get_default_revision():
del project.attrib["revision"]
print("Adding dependency: %s -> %s" % (project.attrib["name"], project.attrib["path"]))
lm.append(project)
indent(lm, 0)
raw_xml = ElementTree.tostring(lm).decode()
raw_xml = '<?xml version="1.0" encoding="UTF-8"?>\n' + raw_xml
f = open('.repo/local_manifests/roomservice.xml', 'w')
f.write(raw_xml)
f.close()
def fetch_dependencies(repo_path):
print('Looking for dependencies in %s' % repo_path)
dependencies_path = repo_path + '/lineage.dependencies'
syncable_repos = []
verify_repos = []
if os.path.exists(dependencies_path):
dependencies_file = open(dependencies_path, 'r')
dependencies = json.loads(dependencies_file.read())
fetch_list = []
for dependency in dependencies:
if not is_in_manifest(dependency['target_path']):
fetch_list.append(dependency)
syncable_repos.append(dependency['target_path'])
if 'branch' not in dependency:
if dependency.get('remote', 'github') == 'github':
dependency['branch'] = get_default_or_fallback_revision(dependency['repository'])
if not dependency['branch']:
sys.exit(1)
else:
dependency['branch'] = None
verify_repos.append(dependency['target_path'])
if not os.path.isdir(dependency['target_path']):
syncable_repos.append(dependency['target_path'])
dependencies_file.close()
if len(fetch_list) > 0:
print('Adding dependencies to manifest')
add_to_manifest(fetch_list)
else:
print('%s has no additional dependencies.' % repo_path)
if len(syncable_repos) > 0:
print('Syncing dependencies')
if not dryrun:
os.system('repo sync --force-sync %s' % ' '.join(syncable_repos))
for deprepo in verify_repos:
fetch_dependencies(deprepo)
def get_default_or_fallback_revision(repo_name):
default_revision = get_default_revision()
print("Default revision: %s" % default_revision)
print("Checking branch info")
try:
stdout = subprocess.run(
["git", "ls-remote", "-h", "https://:@github.com/LineageOS/" + repo_name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
).stdout.decode()
branches = [x.split("refs/heads/")[-1] for x in stdout.splitlines()]
except:
return ""
if default_revision in branches:
return default_revision
if os.getenv('ROOMSERVICE_BRANCHES'):
fallbacks = list(filter(bool, os.getenv('ROOMSERVICE_BRANCHES').split(' ')))
for fallback in fallbacks:
if fallback in branches:
print("Using fallback branch: %s" % fallback)
return fallback
print("Default revision %s not found in %s. Bailing." % (default_revision, repo_name))
print("Branches found:")
for branch in branches:
print(branch)
print("Use the ROOMSERVICE_BRANCHES environment variable to specify a list of fallback branches.")
return ""
if depsonly:
repo_path = get_from_manifest(device)
if repo_path:
fetch_dependencies(repo_path)
else:
print("Trying dependencies-only mode on a non-existing device tree?")
sys.exit()
else:
for repo_name in repositories:
if re.match(r"^android_device_[^_]*_" + device + "$", repo_name):
print("Found repository: %s" % repo_name)
manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "")
repo_path = "device/%s/%s" % (manufacturer, device)
revision = get_default_or_fallback_revision(repo_name)
if revision == "":
# Some devices have the same codename but shipped a long time ago and may not have
# a current branch set up.
# Continue looking up all repositories until a match is found or no repos are left
# to check.
continue
device_repository = {'repository':repo_name,'target_path':repo_path,'branch':revision}
add_to_manifest([device_repository])
print("Syncing repository to retrieve project.")
os.system('repo sync --force-sync %s' % repo_path)
print("Repository synced!")
fetch_dependencies(repo_path)
print("Done")
sys.exit()
print("Repository for %s not found in the LineageOS Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device)