feat: Add option to clear home screen in settings (#6125)

Signed-off-by: abhixv <abhi.sharma1@hotmail.com>
This commit is contained in:
Abhishek Sharma
2025-12-20 03:26:30 +05:30
committed by Pun Butrach
parent 9898749619
commit 5f3a03f4fb
1577 changed files with 112563 additions and 80248 deletions
+4 -1
View File
@@ -3,7 +3,7 @@ changelog:
labels:
- bot
authors:
- renovate[bot]
- renovate
- lawnchair-bot
- crowdin-bot
categories:
@@ -18,3 +18,6 @@ changelog:
- title: 🧹 Housekeeping
labels:
- housekeeping
- title: 🧑‍💻 Dependencies
labels:
- dependencies
+2 -3
View File
@@ -52,7 +52,7 @@ jobs:
echo ${{ secrets.KEYSTORE }} | base64 --decode > ${{ github.workspace }}/key.jks
fi
- name: Build debug APK
run: ./gradlew assembleLawnWithQuickstepNightlyRelease assembleLawnWithQuickstepGithubDebug assembleLawnWithQuickstepPlayDebug --no-configuration-cache
run: ./gradlew assembleLawnWithQuickstepGithubDebug assembleLawnWithQuickstepPlayDebug assembleLawnWithQuickstepNightlyRelease --no-configuration-cache
- name: Upload artifact
uses: actions/upload-artifact@v6
with:
@@ -118,8 +118,7 @@ jobs:
nightly-release:
runs-on: ubuntu-latest
if: false
# if: github.repository_owner == 'LawnchairLauncher' && github.event_name == 'push' && github.ref == 'refs/heads/15-dev'
if: github.repository_owner == 'LawnchairLauncher' && github.event_name == 'push' && github.ref == 'refs/heads/15-dev'
needs: build-debug-apk
permissions:
contents: write
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
upload_translations: false
upload_sources: true
download_translations: true
localization_branch_name: 16-dev-localization
localization_branch_name: 15-dev-localization
create_pull_request: true
base_url: 'https://lawnchair.crowdin.com'
env:
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
upload_translations: false
upload_sources: false
download_translations: true
localization_branch_name: 16-dev-localization
localization_branch_name: 15-dev-localization
create_pull_request: true
base_url: 'https://lawnchair.crowdin.com'
env:
+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
upload_translations: false
upload_sources: true
download_translations: false
localization_branch_name: 16-dev-localization
localization_branch_name: 15-dev-localization
create_pull_request: false
base_url: 'https://lawnchair.crowdin.com'
env:
-1
View File
@@ -1,4 +1,3 @@
[submodule "platform_frameworks_libs_systemui"]
path = platform_frameworks_libs_systemui
url = https://github.com/LawnchairLauncher/platform_frameworks_libs_systemui
branch = 16-dev
+16 -291
View File
@@ -17,19 +17,7 @@ package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
min_launcher3_sdk_version = "31"
// Targets that don't inherit framework aconfig libs (i.e., those that don't set
// `platform_apis: true`) must manually link them.
java_defaults {
name: "launcher-non-platform-apis-defaults",
static_libs: [
"android.os.flags-aconfig-java",
"android.multiuser.flags-aconfig-java",
"android.appwidget.flags-aconfig-java",
"com.android.window.flags.window-aconfig-java",
],
}
min_launcher3_sdk_version = "30"
// Common source files used to build launcher (java and kotlin)
// All sources are split so they can be reused in many other libraries/apps in other folders
@@ -43,122 +31,12 @@ filegroup {
],
}
// Main Launcher source for compose, excluding the build config
filegroup {
name: "launcher-compose-enabled-src",
srcs: [
"compose/facade/enabled/*.kt",
"compose/facade/core/*.kt",
"compose/features/**/*.kt",
],
}
filegroup {
name: "launcher-compose-disabled-src",
srcs: [
"compose/facade/core/*.kt",
"compose/facade/disabled/*.kt",
],
}
// Source code for quickstep build, on top of launcher-src
filegroup {
name: "launcher-quickstep-src",
srcs: [
"quickstep/src/**/*.kt",
"quickstep/src/**/*.java",
],
device_common_srcs: [
":launcher-quickstep-processed-protolog-src",
],
}
// Launcher ProtoLog support
filegroup {
name: "launcher-quickstep-unprocessed-protolog-src",
srcs: [
"quickstep/src_protolog/**/*.java",
],
}
java_library {
name: "launcher-quickstep_protolog-groups",
srcs: [
"quickstep/src_protolog/**/*.java",
],
static_libs: [
"protolog-group",
"androidx.annotation_annotation",
"com_android_launcher3_flags_lib",
],
}
java_genrule {
name: "launcher-quickstep-processed-protolog-src",
srcs: [
":protolog-impl",
":launcher-quickstep-unprocessed-protolog-src",
":launcher-quickstep_protolog-groups",
],
tools: ["protologtool"],
cmd: "$(location protologtool) transform-protolog-calls " +
"--protolog-class com.android.internal.protolog.common.ProtoLog " +
"--loggroups-class com.android.quickstep.util.QuickstepProtoLogGroup " +
"--loggroups-jar $(location :launcher-quickstep_protolog-groups) " +
"--viewer-config-file-path /system_ext/etc/launcher.quickstep.protolog.pb " +
"--output-srcjar $(out) " +
"$(locations :launcher-quickstep-unprocessed-protolog-src)",
out: ["launcher.quickstep.protolog.srcjar"],
}
java_genrule {
name: "gen-launcher.quickstep.protolog.pb",
srcs: [
":launcher-quickstep-unprocessed-protolog-src",
":launcher-quickstep_protolog-groups",
],
tools: ["protologtool"],
cmd: "$(location protologtool) generate-viewer-config " +
"--protolog-class com.android.internal.protolog.common.ProtoLog " +
"--loggroups-class com.android.quickstep.util.QuickstepProtoLogGroup " +
"--loggroups-jar $(location :launcher-quickstep_protolog-groups) " +
"--viewer-config-type proto " +
"--viewer-config $(out) " +
"$(locations :launcher-quickstep-unprocessed-protolog-src)",
out: ["launcher.quickstep.protolog.pb"],
}
prebuilt_etc {
name: "launcher.quickstep.protolog.pb",
system_ext_specific: true,
src: ":gen-launcher.quickstep.protolog.pb",
filename_from_src: true,
}
// Source code for quickstep dagger
filegroup {
name: "launcher-quickstep-dagger",
srcs: [
"quickstep/dagger/**/*.java",
"quickstep/dagger/**/*.kt",
],
}
// Source code for quickstep build with compose enabled, on top of launcher-src
filegroup {
name: "launcher-quickstep-compose-enabled-src",
srcs: [
"quickstep/compose/facade/core/*.kt",
"quickstep/compose/facade/enabled/*.kt",
"quickstep/compose/features/**/*.kt",
],
}
filegroup {
name: "launcher-quickstep-compose-disabled-src",
srcs: [
"quickstep/compose/facade/core/*.kt",
"quickstep/compose/facade/disabled/*.kt",
"quickstep/src/**/*.kt",
],
}
@@ -185,118 +63,10 @@ filegroup {
srcs: ["proguard.flags"],
}
// Opt-in configuration for Launcher3 code depending on Jetpack Compose.
soong_config_module_type {
name: "launcher_compose_java_defaults",
module_type: "java_defaults",
config_namespace: "ANDROID",
bool_variables: ["release_enable_compose_in_launcher"],
properties: [
"srcs",
"static_libs",
],
}
// Opt-in configuration for Launcher Quickstep code depending on Jetpack Compose.
soong_config_bool_variable {
name: "release_enable_compose_in_launcher",
}
soong_config_module_type {
name: "quickstep_compose_java_defaults",
module_type: "java_defaults",
config_namespace: "ANDROID",
bool_variables: ["release_enable_compose_in_launcher"],
properties: [
"srcs",
"static_libs",
],
}
soong_config_module_type {
name: "launcher_compose_tests_java_defaults",
module_type: "java_defaults",
config_namespace: "ANDROID",
bool_variables: ["release_enable_compose_in_launcher"],
properties: [
"static_libs",
],
}
launcher_compose_java_defaults {
name: "launcher_compose_defaults",
soong_config_variables: {
release_enable_compose_in_launcher: {
srcs: [
":launcher-compose-enabled-src",
],
// Compose dependencies
static_libs: [
"androidx.compose.runtime_runtime",
"androidx.compose.material3_material3",
],
// By default, Compose is disabled and we compile the ComposeFacade
// in compose/launcher3/facade/disabled/.
conditions_default: {
srcs: [
":launcher-compose-disabled-src",
],
static_libs: [],
},
},
},
}
quickstep_compose_java_defaults {
name: "quickstep_compose_defaults",
soong_config_variables: {
release_enable_compose_in_launcher: {
srcs: [
":launcher-quickstep-compose-enabled-src",
],
// Compose dependencies
static_libs: [
"androidx.compose.runtime_runtime",
"androidx.compose.material3_material3",
],
// By default, Compose is disabled and we compile the ComposeFacade
// in compose/quickstep/facade/disabled/.
conditions_default: {
srcs: [
":launcher-quickstep-compose-disabled-src",
],
static_libs: [],
},
},
},
}
launcher_compose_tests_java_defaults {
name: "launcher_compose_tests_defaults",
soong_config_variables: {
release_enable_compose_in_launcher: {
// Compose dependencies
static_libs: [
"androidx.compose.runtime_runtime",
"androidx.compose.ui_ui-test-junit4",
"androidx.compose.ui_ui-test-manifest",
],
conditions_default: {
static_libs: [],
},
},
},
}
android_library {
name: "launcher-aosp-tapl",
libs: [
"framework-statsd.stubs.module_lib",
"framework-statsd",
],
static_libs: [
"androidx.annotation_annotation",
@@ -306,7 +76,6 @@ android_library {
"androidx.preference_preference",
"SystemUISharedLib",
"//frameworks/libs/systemui:animationlib",
"//frameworks/libs/systemui:contextualeducationlib",
"launcher-testing-shared",
],
srcs: [
@@ -367,14 +136,12 @@ java_library {
// Library with all the dependencies for building Launcher3
android_library {
name: "Launcher3ResLib",
defaults: [
"launcher_compose_defaults",
],
srcs: [],
resource_dirs: ["res"],
static_libs: [
"LauncherPluginLib",
"launcher_quickstep_log_protos_lite",
"android.os.flags-aconfig-java",
"androidx-constraintlayout_constraintlayout",
"androidx.recyclerview_recyclerview",
"androidx.dynamicanimation_dynamicanimation",
@@ -387,10 +154,7 @@ android_library {
"//frameworks/libs/systemui:iconloader_base",
"//frameworks/libs/systemui:view_capture",
"//frameworks/libs/systemui:animationlib",
"//frameworks/libs/systemui:contextualeducationlib",
"//frameworks/libs/systemui:msdl",
"SystemUI-statsd",
"WindowManager-Shell-shared-AOSP",
"launcher-testing-shared",
"androidx.lifecycle_lifecycle-common-java8",
"androidx.lifecycle_lifecycle-extensions",
@@ -399,9 +163,8 @@ android_library {
"kotlinx_coroutines",
"com_android_launcher3_flags_lib",
"com_android_wm_shell_flags_lib",
"dagger2",
"jsr330",
"com_android_systemui_shared_flags_lib",
"android.appwidget.flags-aconfig-java",
"com.android.window.flags.window-aconfig-java",
],
manifest: "AndroidManifest-common.xml",
sdk_version: "current",
@@ -409,9 +172,6 @@ android_library {
lint: {
baseline_filename: "lint-baseline.xml",
},
flags_packages: [
"com_android_launcher3_flags",
],
}
//
@@ -419,7 +179,6 @@ android_library {
//
android_app {
name: "Launcher3",
defaults: ["launcher-non-platform-apis-defaults"],
static_libs: [
"Launcher3ResLib",
@@ -431,7 +190,7 @@ android_app {
],
optimize: {
proguard_flags_files: [":launcher-proguard-rules"],
proguard_flags_files: ["proguard.pro"],
// Proguard is disable for testing. Derivarive prjects to keep proguard enabled
enabled: false,
},
@@ -439,7 +198,6 @@ android_app {
sdk_version: "current",
min_sdk_version: min_launcher3_sdk_version,
target_sdk_version: "current",
plugins: ["dagger2-compiler"],
privileged: true,
system_ext_specific: true,
@@ -456,12 +214,8 @@ android_app {
"AndroidManifest-common.xml",
],
lint: {
extra_check_modules: ["Launcher3LintChecker"],
baseline_filename: "lint-baseline.xml",
},
kotlincflags: [
"-Xjvm-default=all",
],
}
// Library with all the dependencies for building quickstep
@@ -472,34 +226,24 @@ android_library {
"quickstep/res",
],
libs: [
"framework-statsd.stubs.module_lib",
"framework-statsd",
],
static_libs: [
"Launcher3ResLib",
"lottie",
"SystemUISharedLib",
"SettingsLibSettingsTheme",
"dagger2",
"protolog-group",
],
manifest: "quickstep/AndroidManifest.xml",
min_sdk_version: "current",
lint: {
disabled_checks: ["MissingClass"],
},
}
// Library with all the source code and dependencies for building Launcher Go
android_library {
name: "Launcher3GoLib",
defaults: [
"launcher_compose_defaults",
"quickstep_compose_defaults",
],
srcs: [
":launcher-src",
":launcher-quickstep-src",
":launcher-quickstep-dagger",
"go/quickstep/src/**/*.java",
"go/quickstep/src/**/*.kt",
],
@@ -514,10 +258,7 @@ android_library {
"QuickstepResLib",
"androidx.room_room-runtime",
],
plugins: [
"androidx.room_room-compiler-plugin",
"dagger2-compiler",
],
plugins: ["androidx.room_room-compiler-plugin"],
manifest: "quickstep/AndroidManifest.xml",
additional_manifests: [
"go/AndroidManifest.xml",
@@ -526,27 +267,19 @@ android_library {
min_sdk_version: "current",
// TODO(b/319712088): re-enable use_resource_processor
use_resource_processor: false,
kotlincflags: [
"-Xjvm-default=all",
],
}
// Library with all the source code and dependencies for building Quickstep
android_library {
name: "Launcher3QuickStepLib",
defaults: [
"launcher_compose_defaults",
"quickstep_compose_defaults",
],
srcs: [
":launcher-src",
":launcher-quickstep-src",
":launcher-quickstep-dagger",
":launcher-build-config",
],
resource_dirs: [],
libs: [
"framework-statsd.stubs.module_lib",
"framework-statsd",
],
// Note the ordering here is important when it comes to resource
// overriding. We want the most specific resource overrides defined
@@ -558,23 +291,18 @@ android_library {
],
manifest: "quickstep/AndroidManifest.xml",
platform_apis: true,
plugins: ["dagger2-compiler"],
min_sdk_version: "current",
// TODO(b/319712088): re-enable use_resource_processor
use_resource_processor: false,
kotlincflags: [
"-Xjvm-default=all",
],
}
// Build rule for Quickstep app.
android_app {
name: "Launcher3QuickStep",
static_libs: ["Launcher3QuickStepLib"],
optimize: {
proguard_flags_files: [":launcher-proguard-rules"],
enabled: true,
shrink_resources: true,
enabled: false,
},
platform_apis: true,
@@ -588,10 +316,7 @@ android_app {
"Launcher2",
"Launcher3",
],
required: [
"privapp_whitelist_com.android.launcher3",
"launcher.quickstep.protolog.pb",
],
required: ["privapp_whitelist_com.android.launcher3"],
resource_dirs: ["quickstep/res"],
@@ -607,11 +332,13 @@ android_app {
}
// Build rule for Launcher3 Go app with quickstep for Android Go devices.
// Note that the following two rules are exactly same, and should
// eventually be merged into a single target
android_app {
name: "Launcher3Go",
static_libs: ["Launcher3GoLib"],
resource_dirs: [],
@@ -622,7 +349,6 @@ android_app {
optimize: {
proguard_flags_files: ["proguard.flags"],
enabled: true,
shrink_resources: true,
},
privileged: true,
@@ -646,9 +372,9 @@ android_app {
include_filter: ["com.android.launcher3.*"],
},
}
android_app {
name: "Launcher3QuickStepGo",
static_libs: ["Launcher3GoLib"],
resource_dirs: [],
@@ -659,7 +385,6 @@ android_app {
optimize: {
proguard_flags_files: ["proguard.flags"],
enabled: true,
shrink_resources: true,
},
privileged: true,
+5 -3
View File
@@ -136,11 +136,13 @@
android:writePermission="${applicationId}.permission.WRITE_SETTINGS"
android:readPermission="${applicationId}.permission.READ_SETTINGS" />
<!-- The content provider for exposing various launcher grid options. -->
<!--
The content provider for exposing various launcher grid options.
TODO: Add proper permissions
-->
<provider
android:name="com.android.launcher3.graphics.LauncherCustomizationProvider"
android:name="com.android.launcher3.graphics.GridCustomizationsProvider"
android:authorities="${applicationId}.grid_control"
android:permission="android.permission.BIND_WALLPAPER"
android:exported="true" />
<!--
-1
View File
@@ -63,7 +63,6 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SHOW_WORK_APPS" />
<action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
+39 -34
View File
@@ -17,10 +17,6 @@ feel free to reach out on [Telegram][telegram] or [Discord][discord].
> Use the [Lawnchair Nightly builds][nightly] when reporting bugs, as your issue may have already
> been fixed.
> [!WARNING]
> For [security vulnerability][security-report], please do not open an issue. Instead, follow
> the instructions in our [Security Policy][security-policy].
- For **[bug reports][bug-reports]**, please be as detailed as possible and provide clear steps to
reproduce the issue.
- For **[feature requests][feature-requests]**, clearly describe the feature and its potential
@@ -44,13 +40,13 @@ For translations, please visit **[Lawnchair on Crowdin][crowdin]**.
2. Open the project in Android Studio.
3. Select the `lawnWithQuickstepGithubDebug` build variant.
If you encounter errors with modules that ends with `lib` suffix like `iconloaderlib` or `searchuilib`,
run `git submodule update --init --recursive`.
If you encounter errors with the `iconloaderlib` or `searchuilib` modules, run
`git submodule update --init --recursive`.
Here are some contribution tips to help you get started:
- Always make sure that you're up-to-date with **Lawnchair** by setting your base branch to
`16-dev`.
`15-dev`.
- Make sure your code is logical and well-formatted. If using Kotlin,
see [“Coding conventions” in the Kotlin documentation][kotlin-coding-conventions];
- [The `lawnchair` package][lawnchair-package]
@@ -61,12 +57,10 @@ Here are some contribution tips to help you get started:
### Additional documentation
- [Lawnchair roadmap](ROADMAP.md)
- [Lawnchair verification](VERIFICATION.md)
- [The Lawnchair Wiki](https://github.com/LawnchairLauncher/lawnchair/wiki)
- [Lawnchair Visual Guidelines](/docs/assets/README.md)
- [Lawnchair Quickstep Compat Library](compatLib/README.md)
- [Lawnchair Preferences Components](lawnchair/src/app/lawnchair/ui/preferences/components/README.md)
- [Lawnchair Platform Frameworks Library SystemUI](platform_frameworks_libs_systemui/README.md)
- [SystemUI Module](systemUI/README.md)
- [ViewCapture](systemUI/viewcapture/README.md)
- [Common](systemUI/common/README.md)
@@ -75,7 +69,7 @@ Here are some contribution tips to help you get started:
### Development workflow
We use a tiered workflow to balance development speed with stability. The process for merging a
change depends on its complexity and risk. All PRs should target the `16-dev` branch.
change depends on its complexity and risk. All PRs should target the `15-dev` branch.
| Tier | Definition | Examples | Protocol |
|-----------------------------|-------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -94,7 +88,8 @@ We follow the **[Conventional Commits specification][conventional-commits]**.
### Versioning scheme
Lawnchairs version code is composed of five parts, separated by underscores:
As of Lawnchair 15 Beta 1, Lawnchairs version code is composed of four parts, separated by
underscores:
<p align="center">
<picture>
@@ -106,21 +101,39 @@ Lawnchairs version code is composed of five parts, separated by underscores:
1. Android major version
2. Android minor version
3. Lawnchair development stage
3. Lawnchair development status
4. Lawnchair development version
5. Revision/Release number
#### Lawnchair development stage
#### Android major & minor versions
This table show list of development stages in use by Lawnchair:
These represent the Android version in which Lawnchair is based on.
They make up the first two parts of the version code:
| Stage | Denote |
|-------------------|--------|
| Development | 00 |
| Alpha | 01 |
| Beta | 02 |
| Release Candidate | 03 |
| Release | 04 |
- Major version: Indicates the main Android version.
- Minor version: Reflects any point release or update within the major version.
Example: Android 11 will be `11_00_XX_XX` while Android 12.1 will be `12_01_XX_XX`.
#### Development status & version
The third and fourth parts of the version code refer to Lawnchair's development stage
and the specific version within that stage:
- Development status: Shows the current development stage of the Lawnchair build (e.g., Alpha,
Beta).
- Development version: Specifies the incremental version within the same development stage.
The table below shows release phase used by Lawnchair:
| Status | Stage |
|-------------------|-------|
| Development | 00 |
| Alpha | 01 |
| Beta | 02 |
| Release Candidate | 03 |
| Release | 04 |
Example: Alpha 5 will be `XX_XX_01_05` and Beta 3 will be `XX_XX_02_03`.
### String naming
@@ -141,33 +154,25 @@ Strings `names` in `strings.xml` should follow this format:
Lawnchair uses a locally stored JSON file (`google_fonts.json`) to list available fonts from Google
Fonts. This file should be updated periodically or before release to include the latest fonts.
To update Lawnchairs font listing, follow these steps:
To update Lawnchair's font listing, follow these steps:
1. Get
1. Acquire
a [Google Fonts Developer API key][google-fonts-api-key].
2. Download the JSON file from `https://www.googleapis.com/webfonts/v1/webfonts?key=API_KEY`,
replacing `API_KEY` with the API key from step 1.
3. Replace the content of [`google_fonts.json`](lawnchair/assets/google_fonts.json) with the API
response.
#### Writing or updating Lawnchair documentation
Lawnchairs documentations are written in Markdown and follow a style guides from
[Google developer documentation style guide](https://developers.google.com/style).
<!-- Links -->
[telegram]: https://t.me/lccommunity
[discord]: https://discord.com/invite/3x8qNWxgGZ
[nightly]: https://github.com/LawnchairLauncher/lawnchair/releases/tag/nightly
[security-report]: https://github.com/LawnchairLauncher/lawnchair/security/advisories/new
[security-policy]: https://github.com/LawnchairLauncher/lawnchair/security/policy
[bug-reports]: https://github.com/LawnchairLauncher/lawnchair/issues/new?assignees=&labels=bug&projects=&template=bug_report.yaml&title=%5BBUG%5D+
[feature-requests]: https://github.com/LawnchairLauncher/lawnchair/issues/new?assignees=&labels=feature%2Cenhancement&projects=&template=feature_request.yaml&title=%5BFEATURE%5D+
[code-of-conduct]: CODE_OF_CONDUCT.md
[crowdin]: https://lawnchair.crowdin.com
[kotlin-coding-conventions]: https://kotlinlang.org/docs/coding-conventions.html
[lawnchair-package]: https://github.com/LawnchairLauncher/lawnchair/tree/16-dev/lawnchair
[src-package]: https://github.com/LawnchairLauncher/lawnchair/tree/16-dev/src
[lawnchair-package]: https://github.com/LawnchairLauncher/lawnchair/tree/15-dev/lawnchair
[src-package]: https://github.com/LawnchairLauncher/lawnchair/tree/15-dev/src
[conventional-commits]: https://www.conventionalcommits.org/en/v1.0.0/
[google-fonts-api-key]: https://developers.google.com/fonts/docs/developer_api#APIKey
+38 -340
View File
@@ -1,349 +1,47 @@
Lawnchair 16 pE Development 3 is here! Contributors are encouraged to target this branch instead of
older (i.e., Lawnchair `15-dev`).
> [!TIP]
> For the story behind this release, see [the announcement](https://lawnchair.app/blog/lawnchair-15-beta-1) on our website.
### 🏗️ Development 3 Release 3
Lawnchair 15 Beta 1 is a foundational release based on Launcher3 from Android 15. This version works with QuickSwitch from Android 10 to Android 15 QPR1. Higher Android versions are not yet supported.
Build: BD3.1312 (latest), BD3.0812, BD3.0712
### New Features
* **Android 15 Support:** Includes core platform features like Private Space and App Archiving.
* **App Drawer Folders:** A major new way to organize your app drawer.
* **Manual Folders:** Create, edit, and re-arrange your own custom folders.
* **Automatic Organization ("Caddy"):** An experimental feature to automatically categorize your entire app drawer into smart folders.
* **Dock Enhancements:**
* Add a background to the dock with options for color and corner radius.
* Place widgets directly in the dock.
* Show icon labels for apps in the dock.
* **Wallpaper Carousel:** A new pop-up menu item to quickly switch between your current and recent wallpapers, similar to the Pixel Launcher.
* **App Pausing:** For rooted users with QuickSwitch, you can now manually pause applications directly from the launcher.
* **Expanded Search Options:**
* Add custom search engines for web suggestions in the app drawer.
* New web search providers added, including Ecosia, Kagi, Firefox, Iceraven, and Mull.
* **"Deck" (Experimental):** An initial implementation of a "no app drawer" mode. *Please create a launcher backup before trying this feature to prevent data loss.*
Compatibility list:
### Improvements
* **UI:** Updated many UI components to better align with Material 3 design principles.
* **Gestures:** Added "Open Recents Screen" and "Open Assistant" as new gesture actions.
* **Pop-Up Menu:** The long-press menu options can now be reordered.
* **Settings:** Reorganized many settings for a more intuitive experience and centralized all search-related settings into a single screen.
| 🏗️ Crash | 🥞 Fully supported |
|-------------|--------------------|
| Android 8.1 | Android 12.0 |
| Android 9 | Android 12.1 |
| Android 10 | Android 13 |
| Android 11 | Android 14 |
| | Android 15 |
| | Android 16 |
### Core & Under-the-Hood
* **Type-Safe Navigation:** The settings infrastructure has been rewritten using modern Jetpack Compose Navigation for enhanced stability.
* **Build & Dependency Updates:** Major updates to dependencies and build scripts improve performance and maintainability.
* **New Translations:** Translations have been updated from Crowdin.
* **Nightly Builds:** A formal nightly build system is now in place for easier access to development versions.
* **Crash & Bug Fixes:** Implemented numerous fixes for various OEM skins (Lenovo, Motorola), custom ROMs, and older Android versions.
#### Features
* [Lawnchair] Features from Lawnchair 15-dev 07122025
* [Launcher] Google Sans Flex font uses almost the exact same configuration as Pixel
* [Launcher] Enable bulk loading by default
* [Launcher] Tablet support (ish)
* [Launcher] Refreshed Material 3 Expressive
* [Lawnchair] Refreshed Material 3 Expressive
* [Launcher] Foldable support (ish)
* [Lawnchair] Warn when nightly updater is updating to next major version
* [Lawnchair/Smartspace] Add Lunar calendar option
* [Lawnchair/Smartspace] Promote smartspace calendar to stable
* [Lawnchair] Expressive redesign Phase 2
* [Lawnchair] GestureNavContract toggle in experimental features
* [Lawnchair] Set GestureNavContract on by default on Google device
* [Lawnchair] Set GestureNavContract on by default on Nothing device
* [Lawnchair] Don't show warning on known compatible device
* [Lawnchair] Swipe to dismiss announcement perform haptic on successful dismiss
* [Lawnchair] Remove Inter v3 fonts from Lawnchair entirely (to reduce apk size)
* [Lawnchair] Add Google Sans variable font as fallback to Google Sans Flex (to support the most of the world languages, yes that increases sizes)
* [Launcher] Google Sans variable normal style
* [Lawnchair] Improve Google device compatibility check
* [Lawnchair] Improve Samsung device compatibility check
### Regressions & Known Issues
* **Icon Badges:** Icon badges for work profile apps are temporarily non-functional due to core changes in the A15 rebase. This is a high-priority item for a future update.
* **'Customize Icon' State:** The bottom sheet for customizing an icon may not update its state immediately. Restarting the launcher will apply the change.
* **App Drawer folders:** As of now, you can't edit app drawer folders from the app drawer. Please visit the settings screen to change the contents of each folder.
#### Fixes
* [Launcher3] Widget preview crash for no reason at all on compatible Android version
* [Launcher] Hotseat Google provider failed to open due to Android pending intent restrictions on Android 14/15/16/16.1
* [Launcher3/DeviceProfile] Positioning of first folder during Lawnchair setup
* [Lawnchair/AllApps] Reimplement app drawer opacity
* [Lawnchair/Recents] Reimplement recents overview opacity
* [Lawnchair/Preference] Misaligned slider and text preference
* [Lawnchair/Smartspace] Allow disabling the smartspace feature
* [Lawnchair] Settings now correctly animate expand/shrink items
* [Lawnchair] Correctly display warning in experimental features (race conditions)
* [Project] Support for Android Studio 2025.2.3 Canary 5 (Bump to AGP 9.0.0-beta05)
* [Lawnchair] Offer a toggle to disable/enable suggestions instead of linking it to ASI if the device is not Google Pixel
Other issues that you may encounter can be found at [our FAQ](https://lawnchair.app/faq/#common-issues).
### 🥞 Development 3 Release 2
### Community & Thanks
This release marks a new chapter in how we engage with our community. We recently formed the **Lawnchair Triage Team**, a group of dedicated volunteers who have already begun the massive task of organizing our issue tracker. Their early efforts have been invaluable in helping us focus development.
Build: BD3.2211
Thanks as well to all the people who have [donated to our Open Collective](https://opencollective.com/lawnchair) and [submitted translations on Crowdin](https://lawnchair.crowdin.com/).
Compatibility list:
| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported |
|-------------|---------------------|--------------------|
| Android 8.1 | | Android 12.0 |
| Android 9 | | Android 12.1 |
| Android 10 | | Android 13 |
| Android 11 | | Android 14 |
| | | Android 15 |
| | | Android 16 |
#### Features
* [Lawnchair] Updated screenshots compressions and fastlane screenshot
* [Lawnchair] Features from Lawnchair 15-dev
* [Launcher3] Widget preview crash for no reason at all on compatible Android version
#### Fixes
* [Lawnchair] Conflict from Lawnchair 15-dev
### Development 3 Release 1
Build: BD3.1711
The biggest change log ever, this marked the end of Bubble Tea [r2] branch as future development
switched to Bubble Tea [QPR1]. See you at Snapshot 7 or Development 4!
(Again) Originally going to launch D3 if most of the issue on tracker have been resolved, but hit a
stability milestone instead.
This release includes 4 new features, and 33 bug fixes,
Reimplemented some of Lawnchair features, better sizing of home screen, updated README.md screenshot
and the inclusion of Bubble Tea project into the official Lawnchair repository as 16-dev!
This release have been tested with:
* ☁️ Pixel 6 (Android 12.0)
* 📱 Nothing (3a)-series (Android 15, Android 16.0)
* 📱 Vivo Y21 (Android 12.0)
* 📱 HTC Wildfire E3 lite (Android 12.0)
* Many more! Unfortunately I only count build from pE Open testing!
Compatibility list:
| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported |
|-------------|---------------------|--------------------|
| Android 8.1 | | Android 12.0 |
| Android 9 | | Android 12.1 |
| Android 10 | | Android 13 |
| Android 11 | | Android 14 |
| | | Android 15 |
| | | Android 16 |
> [!NOTE]
> QuickSwitch compatibility have not been tested at any time during the development of Bubble Tea!
#### Features
* [Lawnchair] Complex Clover icon shape
* [Lawnchair] Very Sunny icon shape
* [Lawnchair/Font] Update Google Fonts listing to 25102025
* [Lawnchair/Gesture] Allow Open Quick Settings*
#### Fixes
* Disable OEM override on launcher settings, (reimplement `ENABLE_AUTO_INSTALLS_LAYOUT` | c51b2a221838aefb610b7146fc4ef7cb34e5e495)
* [Lawnchair/Iconloaderlib] Reimplement custom app name
* [Lawnchair] Reimplement Launcher3 debug page
* [Lawnchair] Reimplement Caddy and App drawer folder
* [Lawnchair] Reimplement Hotseat toggle
* [Lawnchair] Reimplement Favorite application label
* [Lawnchair] Hotseat positioning with favorite icon label enabled placed the same even if label is disabled
* [Lawnchair] Hotseat background now have a reasonably sized margin compared to D2
* [Lawnchair] Qsb sizing now correctly estimate the width based on width of the app/widget layout or DeviceProfile on device with inlined Qsb
* [Lawnchair] Reimplement Allapps opacity configuration
* [DeviceProfile] Crash from createWindowContext on less than Android 12.0
* [QuickstepLauncher] Ignore trying to set SystemUiProxy icon sizes on less than Android 12.1
* [Lawnchair/BlankActivity] Apply Material 3 Expressive button animations
* [Launcher] Disable add widget button if home screen is locked
* [Lawnchair/Iconloaderlib] Crash when trying to set `null` monochrome icon on less than Android 12.1
* [SystemUI/Unfold] Crash when getting configuration for foldable-specific resources
* [Lawnchair/Iconloaderlib] Don't parse monochrome drawable in Android 12.1 or less
* [Launcher3/AllApps] Allow theming of Expressive allapps
* ~~[Lawnchair] Lawnchair can now be compiled in release mode~~
* [Lawnchair] Fix crashes with WM-Shell
* [Lawnchair] Bottom sheet blur will only trigger when your device supported blur*
* [Lawnchair/Lazy] Corner radii of lazy component now matched radius of non-lazy*
* [Lawnchair/Debug] Cleanup the debug menu*
* [Lawnchair/Docs] Warn off danger using 16-dev branch*
* [Launcher3] Crash with predictive back on some device using Android 13/14
* [Launcher3] WindowInsets crash in Android 11
* [Launcher3] Widgets crash on some device using Android 12
* [Launcher3/PrivateSpace] Use custom icons of Private Space lock*
* [Launcher3/Iconloaderlib] App badges for work profile*
* [Lawnchair] Update spacing for dock search settings*
* [Launcher3] Quickstep dispatcher crash on Android 13
* [Launcher3] Crash due to missing resources for Android 8.0
* [Lawnchair/Docs] Update screenshot to 16-dev
### 🥞 Development 2
Originally going to launch D2 if most of the comestic bug fixes have been resolved, but hit a
stability milestone instead.
This release includes 15 new features, and 20 bug fixes,
Lawnchair settings now takes shape of initial material 3 expressive redesign, [(but by no mean finish!)][Lawnget]
launcher should now render icons better than D1 milestone, with auto-adaptive icons feature reimplemented.
This release have been tested with:
* ☁️ Pixel 6 (Android 12.0) - Build: Ad-hoc
* ☁️ Pixel 6a (Android 12.1) - Build: Ad-hoc
* ☁️ Pixel 7 (Android 13) - Build: Ad-hoc
* ☁️ Pixel 9 (Android 15, Android 16.0) - Build: Ad-hoc
* ☁️ Pixel 9 Pro Fold (Android 14, Android 15) - Build: Ad-hoc
* ☁️ Vivo V40 (Android 15) - Build: Ad-hoc
* ☁️ Xiaomi MIX (Android 15) - Build: Ad-hoc
* 📱 Nothing (3a)-series (Android 15) - Build: pE-`15102025`
* 📱 Pixel 9 Pro XL (Android 16.0 QPR2 Beta 2) - Build: pE-`02102025`
* 📱 BLU View 5 Pro (Android 14) - Build: pE-`02102025`
* 📱🔥 Vivo Y21 (Android 12.0) - Build: pE-`08102025`
> [!NOTE]
> QuickSwitch compatibility have not been tested at any time during the development of Bubble Tea!
[Lawnget]: https://www.google.com/teapot
Compatibility list:
| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported |
|-------------|---------------------|--------------------|
| Android 8.1 | Android 12.0 | Android 12.1 |
| Android 9 | | Android 13 |
| Android 10 | | Android 14 |
| Android 11 | | Android 15 |
| | | Android 16 |
#### Features
* Enable All Apps Blur Flags on Phone (oops, forgot about the allAppsSheetForHandheld flag)
* Make Safe Mode check more reliable
* Smartspace Battery now reports battery charging status of Fast (more than 90% of 20 W) and Slow (less than 90% of 5 W) charging
* Show pseudonym version to Settings
* Resizing workspace calculate items position more accurately
* Update Lawnchair default grid size to 4×7 (or 4×6 with smartspace widget)
* Reimplement Hotseat background customisation
* Make haptic on a locked workspace use Google MSDL vibration
* Make Launcher3 colour more accurate to upstream Android 16
* ProvideComposeSheetHandler now have expressive blur
* Lawnchair Settings now uses Material 3 Expressive
* Animate keyboard on/off state on app drawer search (Try enabling automatically show keyboard in app drawer settings and swipe up and down or directly tap “Apps list” in popup menu) -> (Backport not possible)
* Add LeakCanary check to all debug variant of the application
* [DEBUG] Launcher3 feature status diagnostic check in debug menu
* [Documentation] Add more visibility into both app certificate and SLSA verification for app authenticity check [VERIFICATION.md](VERIFICATION.md)
* [Documentation] Initial drafting of Improve documentation v6 (pave-path)
* [Launcher] Widget animations during resize
* [Iconloaderlib] Enable second hand for the clock app
#### Fixes
* Fix unable to access preview for icon style
* Popup's Arrow Theme now has the correct theme
* Widget should open normally after a workaround (C7evQZDJ)
* Fix (1) Search bar and Dock, (2) Folders and App Drawer settings didn't open due to init problems
* Lawnchair should hopefully remember what grid they should be using
* Most if not all of Lawnchair settings should be usable without crashes
* Correct Baseline Profile from old `market` to `play` variant, and now should calculate profile for `nightly`
* Fix Private Space crash when Lawnchair is set as Launcher due to flags only available on A16
* Fix crash on a device with strict export receiver requirements on A14
* Interactable widget crashing due to App Transition Manager being null (C7evQZDJ)
* Icon not responding to mouse cursor -> (Backported to Lawnchair 15)
* Rare NoSuchMethodError crash on IMS canImeRenderGesturalNavButtons
* [Lawnchair] Reimplement Bulk icons toggle
* SettingsCache crashing with SecurityException with unreadable keys (@hide) in Android 12 and newer (assume false)
* Assume flags `enableMovingContentIntoPrivateSpace` is false when ClassNotFoundException on Android 16 devices
* Rare NoSuchMethodError crash on SurfaceControl setEarlyWakeupStart and setEarlyWakeupEnd
* Properly align built-in smartspace in workspace
* Use WM Proxy from Lawnchair instead of System, fix Android 8.1/9/10/11/12.0/12.1 regarding SE, NSME like SystemBarUtils -> (dWkyIGw9), (reworked CllOXHJv)
* LawnchairWindowManagerProxy have been migrated to Dagger
* SystemWindowManagerProxy have been left unused
* [Lawnchair/Iconloaderlib] Update CustomAdaptiveIconDrawable to latest AOSP 13
* [Iconloaderlib] Reset most of the changes to favour more AOSP 16_r02 code then Lawnchair (need rewrite)
* fix icon loaded in monochrome and always monochrome when it is not supposed to
* fix notification dots being twice the size with notification count
* [Lawnchair/Iconloaderlib] Reimplement Lawnchair Iconloaderlib (adaptive icons, monochrome, regular icon)
#### Known Bugs
* Preview can't show device wallpaper -> (lIxkAYGg)
* IDP Preview doesn't refresh on settings change -> workaround is to hit apply and re-open the preview -> (ZbLX3438)
* Workspace theme doesn't refresh until restart -> (ZbLX3438) -> Fixed as part of (31lLEflf, 1MevNrzp)
* Lawnchair Colour can't handle restart causing default colour to be used instead -> Fixed? -> Properly fixed as part of (31lLEflf, 1MevNrzp)
* (Investigating) Work profile switch on widget selector *may* have reverted to Lawnchair 15 style
* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair
### Development 1
First development milestone! Basic launcher functionality should be stable enough.
* Make Lawnchair Launcher launchable in Android 12.1, 13, 14, 15, 16
* Remove two deprecated features (Use Material U Popup, and Use dot pagination)
* Add pseudonym version in debug settings
* Adapt Lawnchair code to Launcher3 16
* Make basic features of Launcher work (App Drawer, Home Screen, Search, Folders, Widgets)
* Enable Material Expressive Flags (Try swiping through launcher page)
* Enable All Apps Blur Flags (Try opening All Apps on supported devices)
* Enable MSDL Haptics Feedback Flags (Try gliding widget or icons across the homescreen)
* Make Predictive Back Gesture work on Android 13, 14, 15, 16 (Try swiping left or right on gesture-based navigational)
* Programmatically set Safe Mode status
#### Known Bugs
* App Icon may sometimes render with less than 0 in height/width causing blank icon to be rendered and crashing ISE on customising icons -> (31lLEflf)
* Any Lawnchair settings using IDP will crash the launcher -> Fixed in Lawnchair 16 pE Development 2
* Icon pack isn't usable -> (DXo69Qzd)
* Dynamic icons will not be themed by launcher
* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair
### Snapshot 6
This is a developer-focused change log:
This snapshot marks the first time Lawnchair 16 is able to compile and build an APK!
* Fix all issues with Java files in both `lawn` and `src`
* Make Lawnchair compilable (with instant crash)
* Move to KSP for Dagger code generation
### Snapshot 5
This is a developer-focused change log:
This snapshot now able to compile all sources (Kotlin files only)
* Fix MORE MORE MORE `lawn` issues
* Use Gradle Version Catalog for consistent dependency version across all modules (Full implementation @ LawnchairLauncher/Lawnchair#5753)
* Magically fix ASM Instrumentation issues (I didn't do anything, it just works now)
* Fix ALL the issues in kotlin stage (`compileLawnWithQuickstepNightlyDebugKotlin`)
* Reintroduce some features from Lawnchair
* Add compatibility checks and workarounds for them
* Fix most issues with Java files in both `lawn` and `src`
### Snapshot 4
This is a developer-focused change log:
This snapshot marks the first time Lawnchair 16 is able to compile all Launcher3 sources!
* Add `MSDLLib` to `platform_frameworks_libs_systemui`
* Add `contextualeducationlib` to `platform_frameworks_libs_systemui`
* Fix issues in both `lawn` and `src` modules
* Fix AIDL sources
* Resolve Lawnchair/LC-TODO lists
* Merge `wmshell.shared` res with res from `wmshell`
* Consistent build reproducibility by specifying dependencies in `build.gradle`
* Some ASM Instrumentation issues (and re-add some…)
* Update documentations
### Snapshot 3
This is a developer-focused change log:
Not a lot of errors left to go!
* Finish correctly implementing all Dagger functions (?)
* Merge Lawnchair 15 Beta 1 into Bubble Tea
* Support for 16-kb page size devices
* Repository rebased and dropped commit
* Switch back from turbine-combined variant to javac variant for prebuilt SystemUI-core-16 because issues with LFS
* MORE MORE fixes regarding turbine-combined to javac
* Publish `platform_frameworks_libs_systemui` to pe 16-dev branch
* ATLEAST check to almost every launcher3 source file
* `Utils` module (stripped)
* Fix Dagger duplicated classes (because of Dagger dependency ksp/kapt mixing)
* Build reproducibility improvements by specifying dependencies in `build.gradle` files
* Fix some of the issues in both `lawn` and `src` modules
### Snapshot 2
This is a developer-focused change log:
This snapshot milestone marked the first time Lawnchair now able to compile all supplementary
modules, `src` + `lawn` will be in Snapshot 5 or Development 1 milestone.
* Merge flags
* Fix some issues with launcher3 sources.
* A temporary workaround with framworks.jar not adding in anim module.
* Shared not having access to animationlib.
* **Switch from javac variant to turbine-combined variant for prebuilt SystemUI-core-16**.
### From Initial snapshot 0 and 1
This is a developer-focused change log:
* Prebuilt updated to Android 16-0.0_r2 (Android 16.0.0 Release 2)
* Submodule have also been refreshed to A16r2
* Baklava Compatlib (QuickSwitch compatibility not guaranteed)
* Refreshed internal documentation like prebuilt, systemUI
And, as always, a huge thanks to all our code contributors for this cycle: @validcube, @Morty0Smith, @benjaminkitt, and @tgex0
+7 -31
View File
@@ -6,8 +6,11 @@
adamcohen@google.com
hyunyoungs@google.com
twickham@google.com
vadimt@google.com
winsonc@google.com
jonmiranda@google.com
awickham@google.com
agvard@google.com
# Launcher workspace eng team
@@ -20,22 +23,19 @@ fransebas@google.com
pinyaoting@google.com
andonian@google.com
sihua@google.com
abegovic@google.com
# Multitasking eng team
tracyzhou@google.com
peanutbutter@google.com
jeremysim@google.com
atsjenk@google.com
hwwang@google.com
brianji@google.com
# Overview eng team
alexchau@google.com
samcackett@google.com
silvajordan@google.com
uwaisashraf@google.com
vinayjoglekar@google.com
willosborn@google.com
# Physical Keyboard & Trackpad eng team
patmanning@google.com
@@ -45,35 +45,11 @@ helencheuk@google.com
shamalip@google.com
zakcohen@google.com
# System Navigation team
brianji@google.com
jonmiranda@google.com
jagrutdesai@google.com
randypfohl@google.com
saumyaprakash@google.com
sukeshram@google.com
twickham@google.com
victortulias@google.com
## Note: some of the below overlap and also work on other integrations like Circle to Search.
# All Apps / QSB team
awickham@google.com
brdayauon@google.com
ganjam@google.com
kylim@google.com
# Smartspace team
xilei@google.com
davidct@google.com
iamiam@google.com
jiuyu@google.com
per-file FeatureFlags.java, globs = set noparent
per-file FeatureFlags.java = sunnygoyal@google.com, winsonc@google.com, adamcohen@google.com, hyunyoungs@google.com, captaincole@google.com, abegovic@google.com
per-file FeatureFlags.java = sunnygoyal@google.com, winsonc@google.com, adamcohen@google.com, hyunyoungs@google.com, captaincole@google.com
per-file DeviceConfigWrapper.java, globs = set noparent
per-file DeviceConfigWrapper.java = sunnygoyal@google.com, winsonc@google.com, adamcohen@google.com, hyunyoungs@google.com, abegovic@google.com
per-file DeviceConfigWrapper.java = sunnygoyal@google.com, winsonc@google.com, adamcohen@google.com, hyunyoungs@google.com
# Predictive Back
per-file LauncherBackAnimationController.java = shanh@google.com, gallmann@google.com
per-file LauncherBackAnimationController.java = shanh@google.com, gallmann@google.com
+1 -2
View File
@@ -1,10 +1,8 @@
[Builtin Hooks]
ktfmt = true
bpfmt = true
[Builtin Hooks Options]
ktfmt = --kotlinlang-style
bpfmt = -d
[Tool Paths]
ktfmt = ${REPO_ROOT}/external/ktfmt/ktfmt.sh
@@ -12,3 +10,4 @@ ktfmt = ${REPO_ROOT}/external/ktfmt/ktfmt.sh
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --config_xml tools/checkstyle.xml --sha ${PREUPLOAD_COMMIT}
flag_hook = ${REPO_ROOT}/frameworks/base/packages/SystemUI/flag_check.py --msg=${PREUPLOAD_COMMIT_MESSAGE} --files=${PREUPLOAD_FILES} --project=${REPO_PATH}
+29 -25
View File
@@ -1,4 +1,4 @@
# Lawnchair 16
# Lawnchair 15
[![Build debug APK](https://github.com/LawnchairLauncher/lawnchair/actions/workflows/ci.yml/badge.svg)](https://github.com/LawnchairLauncher/lawnchair/actions/workflows/ci.yml)
[![Build release APK](https://github.com/LawnchairLauncher/lawnchair/actions/workflows/release_update.yml/badge.svg)](https://github.com/LawnchairLauncher/lawnchair/actions/workflows/release_update.yml)
@@ -9,31 +9,25 @@
[![GitHub Downloads](https://img.shields.io/github/downloads/LawnchairLauncher/lawnchair/total.svg?label=GitHub%20Downloads&logo=github)](https://github.com/LawnchairLauncher/lawnchair/releases)
[![Play Store Installs](https://img.shields.io/endpoint?color=green&logo=googleplay&logoColor=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dapp.lawnchair.play%26l%3DPlay%2520Store%2520Installs%26m%3D%24shortinstalls)](https://play.google.com/store/apps/details?id=app.lawnchair.play)
> [!WARNING]
> This branch contains major changes from the rebase of Launcher3, including breaking changes and refactors that can cause Lawnchair to break.
>
> If you wish to contribute, read our [contributing guidelines](CONTRIBUTING.md). Note that this branch will undergo many changes as we slowly refactor our codebase, so the `16-dev` branch may be particularly unfriendly to new contributors. It is still possible to submit changes to `15-dev`, but new feature development will be focused on this branch.
>
> For regular users, we recommend staying on `15-dev` for stability purposes.
<picture>
<!-- Avoid image being clickable with slight workaround -->
<!-- ❤️ Credit to simonppt for the current mockup on Unsplash
https://unsplash.com/photos/a-white-flower-with-green-leaves-on-a-white-background-ojBNiaeykwc
<!-- ❤️ Credit to Raine for the original mockup on the Lawnchair Discord -->
<!-- ❤️ Credit to Lawrence Kayku for the current mockup on Unsplash
https://unsplash.com/photos/photography-of-green-leaves-ZVKr8wADhpc
-->
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/device-frame.webp" width="250px">
<img alt="A device running Lawnchair Launcher with green flower wallpaper" src="docs/assets/device-frame.webp" width="250px">
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/device-frame.png" width="250px">
<img alt="Google Pixel running Lawnchair Launcher with green wallpaper" src="docs/assets/device-frame.png" width="250px">
</picture>
Lawnchair is a free, open-source home app for Android. Taking Launcher3—Androids default home app—as a starting point, it ports Pixel Launcher features and introduces rich customization options.
This branch houses the codebase of Lawnchair 16, which is currently in development and is based on Launcher3 from Android 16. For Lawnchair 9 to 15, see the branches with the `9-` to `15-` prefixes, respectively.
This branch houses the codebase of Lawnchair 15, which is currently in beta and is based on Launcher3 from Android 15. For Lawnchair 9 to 14, see the branches with the `9-` to `14-` prefixes, respectively.
## Features
- **Material Expressive Theming:** Adapts to your wallpaper and system theme.
- **Material You Theming:** Adapts to your wallpaper and system theme.
- **At a Glance Widget:** Displays information *at a glance* with support for [Smartspacer](https://github.com/KieronQuinn/Smartspacer).
- **QuickSwitch Support:** Integrates with Android Recents on Android 10-15. (requires root)
- **QuickSwitch Support:** Integrates with Android Recents on Android 10 and newer. (requires root)
- **Global Search:** Allows quick access to apps, contacts, and web results from the home screen.
- **Customization Options:** Provides options to tweak icons, fonts, and colors to your liking.
- And more!
@@ -44,26 +38,26 @@ This branch houses the codebase of Lawnchair 16, which is currently in developme
<a href="https://play.google.com/store/apps/details?id=app.lawnchair.play">
<picture>
<!-- Avoid image being clickable with slight workaround -->
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-google-play.webp" height="60">
<img alt="Get it on Google Play" src="docs/assets/badge-google-play.webp" height="60">
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-google-play.png" height="60">
<img alt="Get it on Google Play" src="docs/assets/badge-google-play.png" height="60">
</picture>
</a>
<a href="https://apt.izzysoft.de/fdroid/index/apk/app.lawnchair">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-izzyondroid.webp" height="60">
<img alt="Get it on IzzyOnDroid" src="docs/assets/badge-izzyondroid.webp" height="60">
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-izzyondroid.png" height="60">
<img alt="Get it on IzzyOnDroid" src="docs/assets/badge-izzyondroid.png" height="60">
</picture>
</a>
<a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://github.com/LawnchairLauncher/lawnchair/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-obtainium.webp" height="60">
<img alt="Get it on Obtainium" src="docs/assets/badge-obtainium.webp" height="60">
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-obtainium.png" height="60">
<img alt="Get it on Obtainium" src="docs/assets/badge-obtainium.png" height="60">
</picture>
</a>
<a href="https://github.com/LawnchairLauncher/lawnchair/releases">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-github.webp" height="60">
<img alt="Get it on GitHub" src="docs/assets/badge-github.webp" height="60">
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/badge-github.png" height="60">
<img alt="Get it on GitHub" src="docs/assets/badge-github.png" height="60">
</picture>
</a>
</p>
@@ -80,11 +74,21 @@ These builds offer the latest features and bug fixes at a cost of being slower a
### Verification
Please visit [Lawnchair Verification](VERIFICATION.md) on way to verify Lawnchair.
Verify the integrity of your Lawnchair download using these SHA-256 hashes:
###### Google Play
```
47:AC:92:63:1C:60:35:13:CC:8D:26:DD:9C:FF:E0:71:9A:8B:36:55:44:DC:CE:C2:09:58:24:EC:25:61:20:A7
```
###### Elsewhere
```
74:7C:36:45:B3:57:25:8B:2E:23:E8:51:E5:3C:96:74:7F:E0:AD:D0:07:E5:BA:2C:D9:7E:8C:85:57:2E:4D:C5
```
## Contributing
Please visit the [Lawnchair contributing guidelines](CONTRIBUTING.md) for information and tips on contributing to Lawnchair.
Please visit the [Lawnchair Contributing Guidelines](CONTRIBUTING.md) for information and tips on contributing to Lawnchair.
## Supporting Lawnchair
+1 -2
View File
@@ -9,9 +9,8 @@
The latest version of Lawnchair is the only supported version.
| Version | Supported |
|----------------|--------------------|
| -------------- | ------------------ |
| Nightly build | :white_check_mark: |
| 16 | :white_check_mark: |
| 15 | :white_check_mark: |
| 14 | :x: |
| 13 | :x: |
+6 -193
View File
@@ -1,197 +1,10 @@
Lawnchair 16 pE Development 2 is here! Contributors are encouraged to target this branch instead of
older (i.e., Lawnchair `15-dev`).
*Lawnchair 15 Beta 1 is here!*
### Development 2
We're excited to release the first beta for Lawnchair 15, a foundational update based on Android 15.
Originally going to launch D2 if comestic bug fixes have been resolved, but hit a
stability milestone instead.
The biggest new feature is one of our most requested ever: **App Drawer Folders**. You can now create and reorder custom folders to finally organize your app drawer.
This release includes 15 new features, and 20 bug fixes,
Lawnchair settings now takes shape of initial material 3 expressive redesign, [(but by no mean finish!)](https://www.google.com/teapot)
launcher should now render icons better than D1 milestone, with auto-adaptive icons feature reimplemented.
This release is packed with many other improvements, from a more powerful dock to dozens of UI refinements.
This release have been tested with:
* ☁️ Pixel 6 (Android 12.0) - Build: Ad-hoc
* ☁️ Pixel 6a (Android 12.1) - Build: Ad-hoc
* ☁️ Pixel 7 (Android 13) - Build: Ad-hoc
* ☁️ Pixel 9 (Android 15, Android 16.0) - Build: Ad-hoc
* ☁️ Pixel 9 Pro Fold (Android 14, Android 15) - Build: Ad-hoc
* ☁️ Vivo V40 (Android 15) - Build: Ad-hoc
* ☁️ Xiaomi MIX (Android 15) - Build: Ad-hoc
* 📱 Nothing (3a)-series (Android 15) - Build: pE-`15102025`
* 📱 Pixel 9 Pro XL (Android 16.0 QPR2 Beta 2) - Build: pE-`02102025`
* 📱 BLU View 5 Pro (Android 14) - Build: pE-`02102025`
* 📱🔥 Vivo Y21 (Android 12.0) - Build: pE-`08102025`
> [!NOTE]
> QuickSwitch compatibility have not been tested at any time during the development of Bubble Tea!
Compatibility list:
| 🏗️ Crash | 💫 Limited features | 🥞 Fully supported |
|-------------|---------------------|--------------------|
| Android 8.1 | Android 12.0 | Android 12.1 |
| Android 9 | | Android 13 |
| Android 10 | | Android 14 |
| Android 11 | | Android 15 |
| | | Android 16 |
#### Features
* Enable All Apps Blur Flags on Phone (oops, forgot about the allAppsSheetForHandheld flag)
* Make Safe Mode check more reliable
* Smartspace Battery now reports battery charging status of Fast (more than 90% of 20 W) and Slow (less than 90% of 5 W) charging
* Show pseudonym version to Settings
* Resizing workspace calculate items position more accurately
* Update Lawnchair default grid size to 4×7 (or 4×6 with smartspace widget)
* Reimplement Hotseat background customisation
* Make haptic on a locked workspace use Google MSDL vibration
* Make Launcher3 colour more accurate to upstream Android 16
* ProvideComposeSheetHandler now have expressive blur
* Lawnchair Settings now uses Material 3 Expressive
* Animate keyboard on/off state on app drawer search (Try enabling automatically show keyboard in app drawer settings and swipe up and down or directly tap “Apps list” in popup menu) -> (Backport not possible)
* Add LeakCanary check to all debug variant of the application
* [DEBUG] Launcher3 feature status diagnostic check in debug menu
* [Documentation] Add more visibility into both app certificate and SLSA verification for app authenticity check [VERIFICATION.md](VERIFICATION.md)
* [Documentation] Initial drafting of Improve documentation v6 (pave-path)
* [Launcher] Widget animations during resize
* [Iconloaderlib] Enable second hand for the clock app
#### Fixes
* Fix unable to access preview for icon style
* Popup's Arrow Theme now has the correct theme
* Widget should open normally after a workaround (C7evQZDJ)
* Fix (1) Search bar and Dock, (2) Folders and App Drawer settings didn't open due to init problems
* Lawnchair should hopefully remember what grid they should be using
* Most if not all of Lawnchair settings should be usable without crashes
* Correct Baseline Profile from old `market` to `play` variant, and now should calculate profile for `nightly`
* Fix Private Space crash when Lawnchair is set as Launcher due to flags only available on A16
* Fix crash on a device with strict export receiver requirements on A14
* Interactable widget crashing due to App Transition Manager being null (C7evQZDJ)
* Icon not responding to mouse cursor -> (Backported to Lawnchair 15)
* Rare NoSuchMethodError crash on IMS canImeRenderGesturalNavButtons
* [Lawnchair] Reimplement Bulk icons toggle
* SettingsCache crashing with SecurityException with unreadable keys (@hide) in Android 12 and newer (assume false)
* Assume flags `enableMovingContentIntoPrivateSpace` is false when ClassNotFoundException on Android 16 devices
* Rare NoSuchMethodError crash on SurfaceControl setEarlyWakeupStart and setEarlyWakeupEnd
* Properly align built-in smartspace in workspace
* Use WM Proxy from Lawnchair instead of System, fix Android 8.1/9/10/11/12.0/12.1 regarding SE, NSME like SystemBarUtils -> (dWkyIGw9), (reworked CllOXHJv)
* LawnchairWindowManagerProxy have been migrated to Dagger
* SystemWindowManagerProxy have been left unused
* [Lawnchair/Iconloaderlib] Update CustomAdaptiveIconDrawable to latest AOSP 13
* [Iconloaderlib] Reset most of the changes to favour more AOSP 16_r02 code then Lawnchair (need rewrite)
* fix icon loaded in monochrome and always monochrome when it is not supposed to
* fix notification dots being twice the size with notification count
* [Lawnchair/Iconloaderlib] Reimplement Lawnchair Iconloaderlib (adaptive icons, monochrome, regular icon)
#### Known Bugs
* Preview can't show device wallpaper -> (lIxkAYGg)
* IDP Preview doesn't refresh on settings change -> workaround is to hit apply and re-open the preview -> (ZbLX3438)
* Workspace theme doesn't refresh until restart -> (ZbLX3438) -> Fixed as part of (31lLEflf, 1MevNrzp)
* Lawnchair Colour can't handle restart causing default colour to be used instead -> Fixed? -> Properly fixed as part of (31lLEflf, 1MevNrzp)
* (Investigating) Work profile switch on widget selector *may* have reverted to Lawnchair 15 style
* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair
### 🥞 Development 1
First development milestone! Basic launcher functionality should be stable enough.
* Make Lawnchair Launcher launchable in Android 12.1, 13, 14, 15, 16
* Remove two deprecated features (Use Material U Popup, and Use dot pagination)
* Add pseudonym version in debug settings
* Adapt Lawnchair code to Launcher3 16
* Make basic features of Launcher work (App Drawer, Home Screen, Search, Folders, Widgets)
* Enable Material Expressive Flags (Try swiping through launcher page)
* Enable All Apps Blur Flags (Try opening All Apps on supported devices)
* Enable MSDL Haptics Feedback Flags (Try gliding widget or icons across the homescreen)
* Make Predictive Back Gesture work on Android 13, 14, 15, 16 (Try swiping left or right on gesture-based navigational)
* Programmatically set Safe Mode status
#### Known Bugs
* App Icon may sometimes render with less than 0 in height/width causing blank icon to be rendered and crashing ISE on customising icons -> (31lLEflf)
* Any Lawnchair settings using IDP will crash the launcher -> Fixed in Lawnchair 16 pE Development 2
* Icon pack isn't usable -> (DXo69Qzd)
* Dynamic icons will not be themed by launcher
* Full lists: https://trello.com/b/8IdvO81K/pe-lawnchair
### Snapshot 6
This is a developer-focused change log:
This snapshot marks the first time Lawnchair 16 is able to compile and build an APK!
* Fix all issues with Java files in both `lawn` and `src`
* Make Lawnchair compilable (with instant crash)
* Move to KSP for Dagger code generation
### Snapshot 5
This is a developer-focused change log:
This snapshot now able to compile all sources (Kotlin files only)
* Fix MORE MORE MORE `lawn` issues
* Use Gradle Version Catalog for consistent dependency version across all modules (Full implementation @ LawnchairLauncher/Lawnchair#5753)
* Magically fix ASM Instrumentation issues (I didn't do anything, it just works now)
* Fix ALL the issues in kotlin stage (`compileLawnWithQuickstepNightlyDebugKotlin`)
* Reintroduce some features from Lawnchair
* Add compatibility checks and workarounds for them
* Fix most issues with Java files in both `lawn` and `src`
### Snapshot 4
This is a developer-focused change log:
This snapshot marks the first time Lawnchair 16 is able to compile all Launcher3 sources!
* Add `MSDLLib` to `platform_frameworks_libs_systemui`
* Add `contextualeducationlib` to `platform_frameworks_libs_systemui`
* Fix issues in both `lawn` and `src` modules
* Fix AIDL sources
* Resolve Lawnchair/LC-TODO lists
* Merge `wmshell.shared` res with res from `wmshell`
* Consistent build reproducibility by specifying dependencies in `build.gradle`
* Some ASM Instrumentation issues (and re-add some…)
* Update documentations
### Snapshot 3
This is a developer-focused change log:
Not a lot of errors left to go!
* Finish correctly implementing all Dagger functions (?)
* Merge Lawnchair 15 Beta 1 into Bubble Tea
* Support for 16-kb page size devices
* Repository rebased and dropped commit
* Switch back from turbine-combined variant to javac variant for prebuilt SystemUI-core-16 because issues with LFS
* MORE MORE fixes regarding turbine-combined to javac
* Publish `platform_frameworks_libs_systemui` to pe 16-dev branch
* ATLEAST check to almost every launcher3 source file
* `Utils` module (stripped)
* Fix Dagger duplicated classes (because of Dagger dependency ksp/kapt mixing)
* Build reproducibility improvements by specifying dependencies in `build.gradle` files
* Fix some of the issues in both `lawn` and `src` modules
### Snapshot 2
This is a developer-focused change log:
This snapshot milestone marked the first time Lawnchair now able to compile all supplementary
modules, `src` + `lawn` will be in Snapshot 5 or Development 1 milestone.
* Merge flags
* Fix some issues with launcher3 sources.
* A temporary workaround with framworks.jar not adding in anim module.
* Shared not having access to animationlib.
* **Switch from javac variant to turbine-combined variant for prebuilt SystemUI-core-16**.
### From Initial snapshot 0 and 1
This is a developer-focused change log:
* Prebuilt updated to Android 16-0.0_r2 (Android 16.0.0 Release 2)
* Submodule have also been refreshed to A16r2
* Baklava Compatlib (QuickSwitch compatibility not guaranteed)
* Refreshed internal documentation like prebuilt, systemUI
**Read the full announcement on our blog:**
https://lawnchair.app/blog/lawnchair-15-beta-1
+22 -410
View File
@@ -22,6 +22,13 @@ flag {
bug: "316027081"
}
flag {
name: "enable_grid_only_overview"
namespace: "launcher"
description: "Enable a grid-only overview without a focused task."
bug: "257950105"
}
flag {
name: "enable_cursor_hover_states"
namespace: "launcher"
@@ -36,6 +43,13 @@ flag {
bug: "302189128"
}
flag {
name: "enable_overview_icon_menu"
namespace: "launcher"
description: "Enable updated overview icon and menu within task."
bug: "257950105"
}
flag {
name: "enable_focus_outline"
namespace: "launcher"
@@ -223,6 +237,13 @@ flag {
bug: "323886237"
}
flag {
name: "enable_refactor_task_thumbnail"
namespace: "launcher"
description: "Enables rewritten version of TaskThumbnailViews in Overview"
bug: "331753115"
}
flag {
name: "enable_handle_delayed_gesture_callbacks"
namespace: "launcher"
@@ -235,7 +256,7 @@ flag {
flag {
name: "enable_fallback_overview_in_window"
namespace: "lse_desktop_experience"
namespace: "launcher"
description: "Enables fallback recents opening inside of a window instead of an activity."
bug: "292269949"
}
@@ -289,418 +310,9 @@ flag {
}
}
flag {
name: "enable_container_return_animations"
namespace: "launcher"
description: "Enables the container return animation mirroring launches."
bug: "341017746"
}
flag {
name: "floating_search_bar"
namespace: "launcher"
description: "Search bar persists at the bottom of the screen across Launcher states"
bug: "346408388"
}
flag {
name: "all_apps_sheet_for_handheld"
namespace: "launcher"
description: "All Apps will be presented on a bottom sheet in handheld mode"
bug: "374186088"
}
flag {
name: "all_apps_blur"
namespace: "launcher"
description: "Content behind the all apps panel in Launcher will be blurred."
bug: "400827727"
}
flag {
name: "multiline_search_bar"
namespace: "launcher"
description: "Search bar can wrap to multi-line"
bug: "341795751"
}
flag {
name: "enable_multi_instance_menu_taskbar"
namespace: "launcher"
description: "Menu in Taskbar with options to launch and manage multiple instances of the same app"
bug: "355237285"
}
flag {
name: "navigate_to_child_preference"
namespace: "launcher"
description: "Settings screen supports navigating to child preference if the key is not on the screen"
bug: "293390881"
}
flag {
name: "use_new_icon_for_archived_apps"
namespace: "launcher"
description: "Archived apps will use new cloud icon in app title instead of overlay"
bug: "350758155"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "letter_fast_scroller"
namespace: "launcher"
description: "Change fast scroller to a lettered list"
bug: "358673724"
}
flag {
name: "enable_desktop_task_alpha_animation"
namespace: "launcher"
description: "Enables the animation of the desktop task's background view"
bug: "320307666"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "ignore_three_finger_trackpad_for_nav_handle_long_press"
namespace: "launcher"
description: "Ignore three finger trackpad event for nav handle long press"
bug: "342143522"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "work_scheduler_in_work_profile"
namespace: "launcher"
description: "Enables work scheduler view above the work pause button in work profile."
bug: "361589193"
}
flag {
name: "one_grid_specs"
namespace: "launcher"
description: "Defines the new specs for grids based on OneGrid"
bug: "364711064"
}
flag {
name: "one_grid_mounted_mode"
namespace: "launcher"
description: "Support a fixed landscape mode for handheld devices"
bug: "364711735"
}
flag {
name: "one_grid_rotation_handling"
namespace: "launcher"
description: "New landscape approach for the workspace using different rows and columns in landscape and portrait"
bug: "364711814"
}
flag {
name: "grid_migration_refactor"
namespace: "launcher"
description: "Refactor grid migration such that the code is simpler to understand and update"
bug: "358399271"
}
flag {
name: "accessibility_scroll_on_allapps"
namespace: "launcher"
description: "Scroll to item position if accessibility focused"
bug: "265392261"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_dismiss_prediction_undo"
namespace: "launcher"
description: "Show an 'Undo' snackbar when users dismiss a predicted hotseat item"
bug: "270394476"
}
flag {
name: "enable_all_apps_button_in_hotseat"
namespace: "launcher"
description: "Enables displaying the all apps button in the hotseat."
bug: "270393897"
}
flag {
name: "taskbar_quiet_mode_change_support"
namespace: "launcher"
description: "Support changing quiet mode for user profiles in taskbar."
bug: "345760034"
}
flag {
name: "taskbar_overflow"
namespace: "launcher"
description: "Show recent apps in the taskbar overflow."
bug: "368119679"
}
flag {
name: "enable_active_gesture_proto_log"
namespace: "launcher"
description: "Enables tracking active gesture logs in ProtoLog"
bug: "293182501"
}
flag {
name: "enable_recents_window_proto_log"
namespace: "lse_desktop_experience"
description: "Enables tracking recents window logs in ProtoLog"
bug: "292269949"
}
flag {
name: "enable_state_manager_proto_log"
namespace: "lse_desktop_experience"
description: "Enables tracking state manager logs in ProtoLog"
bug: "292269949"
}
flag {
name: "coordinate_workspace_scale"
namespace: "launcher"
description: "Ensure that the workspace and hotseat scale doesn't conflict and transitions smoothly between launching and closing apps"
bug: "366403487"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_tiered_widgets_by_default_in_picker"
namespace: "launcher"
description: "Shows filtered set of widgets by default and an option to show all widgets in the widget picker"
bug: "356127021"
}
flag {
name: "show_taskbar_pinning_popup_from_anywhere"
namespace: "launcher"
description: "Shows the pinning popup view after long-pressing or right-clicking anywhere on the pinned taskbar"
bug: "297325541"
}
flag {
name: "enable_launcher_overview_in_window"
namespace: "lse_desktop_experience"
description: "Enables launcher recents opening inside of a window instead of being hosted in launcher activity."
bug: "292269949"
}
flag {
name: "use_system_radius_for_app_widgets"
namespace: "launcher"
description: "Use system radius for enforced widget corners instead of a separate 16.dp value"
bug: "373351337"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_contrast_tiles"
namespace: "launcher"
description: "Enable launcher app contrast tiles."
bug: "341217082"
}
flag {
name: "msdl_feedback"
namespace: "launcher"
description: "Enable MSDL feedback for Launcher interactions"
bug: "377496684"
}
flag {
name: "enable_pinning_app_with_context_menu"
namespace: "launcher"
description: "Add options to pin/unpin to taskbar to app context menus."
bug: "375648361"
}
flag {
name: "enable_launcher_icon_shapes"
namespace: "launcher"
description: "Enable launcher icon shape customizations"
bug: "348708061"
}
flag {
name: "predictive_back_to_home_polish"
namespace: "launcher"
description: "Enables workspace reveal animation for predictive back-to-home"
bug: "382453424"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "predictive_back_to_home_blur"
namespace: "launcher"
description: "Adds blur for predictive back-to-home"
bug: "342178850"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_launcher_visual_refresh"
namespace: "launcher"
description: "Adds refresh for font family, app longpress menu icons, and pagination dots"
bug: "395145453"
}
flag {
name: "gsf_res"
namespace: "launcher"
description: "Adds refresh for font family. Needs to be fixed to be used in resources."
bug: "395145453"
is_fixed_read_only: true
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "restore_archived_shortcuts"
namespace: "launcher"
description: "Makes sure pre-archived pinned shortcuts also get restored"
bug: "375414891"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "restore_archived_app_icons_from_db"
namespace: "launcher"
description: "Restores pre-archived icons from db when available, mimicing promise icons"
bug: "391913214"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_mouse_interaction_changes"
namespace: "launcher"
description: "Changes mouse interaction behavior"
bug: "388897603"
}
flag {
name: "enable_alt_tab_kqs_on_connected_displays"
namespace: "lse_desktop_experience"
description: "Enable Alt + Tab KQS support on connected displays"
bug: "394007677"
}
flag {
name: "expressive_theme_in_taskbar_and_navigation"
namespace: "launcher"
description: "Enables the expressive theme and GSF font styles for Taskbar and Gesture Navigation"
bug: "394613212"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_strict_mode"
namespace: "launcher"
description: "Enable Strict Mode for the Launcher app"
bug: "394651876"
}
flag {
name: "extendible_theme_manager"
namespace: "launcher"
description: "Enables custom theme manager in Launcher"
bug: "381897614"
}
flag {
name: "enable_alt_tab_kqs_flatenning"
namespace: "lse_desktop_experience"
description: "Enable Alt + Tab KQS view to show apps in flattened structure"
bug: "382769617"
}
flag {
name: "enable_gesture_nav_on_connected_displays"
namespace: "lse_desktop_experience"
description: "Enables gesture navigation handling on connected displays"
bug: "382130680"
}
flag {
name: "enable_taskbar_behind_shade"
namespace: "lse_desktop_experience"
description: "Keeps taskbar behind notification shade when its pulled down"
bug: "343194358"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_scalability_for_desktop_experience"
namespace: "launcher"
description: "Enable more grid scale options on the launcher for desktop experience"
bug: "375491272"
}
flag {
name: "enable_gesture_nav_horizontal_touch_slop"
namespace: "launcher"
description: "Enables horizontal touch slop checking in non-vertical fling navigation gestures"
bug: "394364217"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "sync_app_launch_with_taskbar_stash"
namespace: "launcher"
description: "Syncs the two animations (app launch, taskbar stash) so they play at the same time."
bug: "319162553"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "remove_apps_refresh_on_right_click"
namespace: "launcher"
description: "Remove predicted apps refresh on right click"
bug: "343650193"
metadata {
purpose: PURPOSE_BUGFIX
}
}
flag {
name: "enable_taskbar_for_direct_boot"
namespace: "launcher"
description: "Initializes parts of Taskbar before onUserUnlocked"
bug: "324485921"
metadata {
purpose: PURPOSE_BUGFIX
}
}
+1 -1
View File
@@ -12,5 +12,5 @@ android {
}
}
addFrameworkJar('framework-16.jar')
addFrameworkJar('framework-15.jar')
compileOnlyCommonJars()
+3 -9
View File
@@ -20,17 +20,11 @@ android {
lawn { dimension = "app" }
withQuickstep { dimension = "recents" }
github { dimension = "channel" }
nightly { dimension = "channel" }
play { dimension = "channel" }
}
testOptions.managedDevices.localDevices {
create("pixel7Api36") {
device = "Pixel 7"
apiLevel = 36
systemImageSource = "google"
}
create("pixel6Api33") {
testOptions.managedDevices.devices {
pixel6Api33(ManagedVirtualDevice) {
device = "Pixel 6"
apiLevel = 33
systemImageSource = "google"
@@ -41,7 +35,7 @@ android {
// This is the configuration block for the Baseline Profile plugin.
// You can specify to run the generators on a managed devices or connected devices.
baselineProfile {
managedDevices += ["pixel6Api33", "pixel7Api36"]
managedDevices += "pixel6Api33"
useConnectedDevices = false
}
@@ -1,7 +1,5 @@
package app.lawnchair.baseline
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
@@ -35,11 +33,9 @@ import org.junit.runner.RunWith
class BaselineProfileGenerator {
@get:Rule
@RequiresApi(Build.VERSION_CODES.P)
val rule = BaselineProfileRule()
@Test
@RequiresApi(Build.VERSION_CODES.P)
fun generate() {
rule.collect(Constants.PACKAGE_NAME) {
// This block defines the app's critical user journey. Here we are interested in
+19 -44
View File
@@ -20,6 +20,7 @@ plugins {
alias(libs.plugins.diffplug.spotless)
}
allprojects {
plugins.withType(AndroidBasePlugin).configureEach {
android {
@@ -31,7 +32,7 @@ allprojects {
}
defaultConfig {
minSdk 26
targetSdk 36
targetSdk 35
vectorDrawables.useSupportLibrary = true
}
lint {
@@ -45,7 +46,6 @@ allprojects {
}
dependencies {
implementation libs.androidx.core.ktx
implementation libs.androidx.core.animation
}
}
@@ -119,9 +119,9 @@ allprojects {
compileOnlyCommonJars = {
dependencies {
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-core-16.jar')
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-statsd-16.jar')
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'WindowManager-Shell-16.jar')
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-core.jar')
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-statsd.jar')
compileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'WindowManager-Shell-15.jar')
compileOnly projects.compatLib
compileOnly projects.compatLib.compatLibVQ
@@ -130,7 +130,6 @@ allprojects {
compileOnly projects.compatLib.compatLibVT
compileOnly projects.compatLib.compatLibVU
compileOnly projects.compatLib.compatLibVV
compileOnly projects.compatLib.compatLibVBaklava
}
}
}
@@ -145,22 +144,20 @@ final def ciRef = System.getenv("GITHUB_REF") ?: ""
final def ciRunNumber = System.getenv("GITHUB_RUN_NUMBER") ?: ""
final def isReleaseBuild = ciBuild && ciRef.contains("beta")
final def devReleaseName = ciBuild ? "Dev.(#${ciRunNumber})" : "Dev.(${buildCommit})"
final def version = "16"
final def releaseName = "Development 3 Release 2"
final def version = "15"
final def releaseName = "Beta 1"
final def versionDisplayName = "${version}.${isReleaseBuild ? releaseName : devReleaseName}"
final def majorVersion = versionDisplayName.split("\\.")[0]
final def quickstepMinSdk = "29"
final def quickstepMaxSdk = "36"
final def quickstepMaxSdk = "35"
android {
namespace "com.android.launcher3"
defaultConfig {
/*
* Lawnchair Launcher 16.0 Development 3 Release 2
* see CONTRIBUTING.md#versioning-scheme
*/
versionCode 16_00_01_03_02
// Lawnchair Launcher 15.0 Beta 1
// See CONTRIBUTING.md#versioning-scheme
versionCode 15_00_02_01
versionName "${versionDisplayName}"
buildConfigField "String", "VERSION_DISPLAY_NAME", "\"${versionDisplayName}\""
buildConfigField "String", "MAJOR_VERSION", "\"${majorVersion}\""
@@ -248,18 +245,12 @@ android {
debug {
applicationIdSuffix ".debug"
resValue("string", "derived_app_name", "Lawnchair (Debug)")
manifestPlaceholders.quickstepMinSdk = "0"
manifestPlaceholders.quickstepMaxSdk = "100000"
buildConfigField "int", "QUICKSTEP_MIN_SDK", "0"
buildConfigField "int", "QUICKSTEP_MAX_SDK", "100000"
}
release {
resValue("string", "derived_app_name", "Lawnchair")
minifyEnabled true
shrinkResources true
pseudoLocalesEnabled false
proguardFiles proguardFilesFromAosp + "proguard.pro"
}
}
@@ -352,7 +343,7 @@ android {
withQuickstep {
res.srcDirs = ['quickstep/res', 'quickstep/recents_ui_overrides/res']
java.srcDirs = ['quickstep/src', 'quickstep/dagger', 'quickstep/recents_ui_overrides/src', 'quickstep/src_protolog']
java.srcDirs = ['quickstep/src', 'quickstep/recents_ui_overrides/src']
manifest.srcFile "quickstep/AndroidManifest.xml"
}
}
@@ -365,14 +356,12 @@ composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_build_reports")
}
addFrameworkJar('framework-16.jar')
addFrameworkJar('framework-15.jar')
dependencies {
implementation projects.iconloaderlib
implementation projects.searchuilib
implementation projects.animationlib
implementation projects.msdllib
implementation projects.contextualeducationlib
// Recents lib dependency
withQuickstepCompileOnly projects.hiddenApi
@@ -384,7 +373,6 @@ dependencies {
withQuickstepCompileOnly projects.plugin
withQuickstepImplementation projects.plugincore
withQuickstepCompileOnly projects.common
withQuickstepCompileOnly projects.utils
// QuickSwitch Compat
withQuickstepImplementation projects.compatLib
@@ -394,15 +382,13 @@ dependencies {
withQuickstepImplementation projects.compatLib.compatLibVT
withQuickstepImplementation projects.compatLib.compatLibVU
withQuickstepImplementation projects.compatLib.compatLibVV
withQuickstepImplementation projects.compatLib.compatLibVBaklava
withQuickstepImplementation projects.wmshell
withQuickstepImplementation projects.flags
implementation libs.androidx.dynamicanimation
implementation fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-statsd-16.jar')
implementation fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'WindowManager-Shell-16.jar')
withQuickstepCompileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'framework-16.jar')
baselineProfile projects.baselineProfile
implementation fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'SystemUI-statsd-15.jar')
implementation fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'WindowManager-Shell-15.jar')
withQuickstepCompileOnly fileTree(dir: FRAMEWORK_PREBUILTS_DIR, include: 'framework-15.jar')
coreLibraryDesugaring libs.android.desugarJdkLibs
@@ -412,21 +398,14 @@ dependencies {
implementation libs.androidx.recyclerview
implementation libs.androidx.preference.ktx
implementation libs.javax.inject
implementation libs.kotlinx.coroutines.android
implementation libs.kotlinx.serialization.json
implementation libs.chickenhook.restrictionbypass
implementation libs.rikka.refine.runtime
implementation libs.androidx.activity.compose
implementation libs.androidx.constraintlayout
implementation libs.androidx.datastore.preferences
implementation platform(libs.compose.bom)
implementation libs.compose.ui
implementation libs.compose.ui.util
implementation libs.compose.ui.graphics
implementation libs.bundles.graphics
debugImplementation libs.compose.ui.tooling
implementation libs.compose.ui.tooling.preview
implementation libs.compose.ui.google.fonts
@@ -458,6 +437,9 @@ dependencies {
implementation libs.libsu.service
// Persian Date
implementation libs.persian.date
implementation libs.airbnb.lottie
// Compose drag and drop library
@@ -471,17 +453,10 @@ dependencies {
implementation libs.hoko.blur
implementation libs.androidx.window
ksp libs.dagger.compiler
implementation libs.dagger.hilt.android
ksp libs.dagger.hilt.compiler
debugImplementation libs.leakcanary.android
}
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
arg("dagger.hilt.disableModulesHaveInstallInCheck", "true")
}
+9 -18
View File
@@ -1,24 +1,15 @@
# Lawnchair Quickstep Compat Library
The `compatLib` library helps integrate Lawnchair with Recents
(also known as QuickSwitch, Quickstep, or sometimes, Lawnstep)
while ensuring backward-compatibility with older Android versions.
The `compatLib` library helps integrate Lawnchair with QuickSwitch while ensuring backward-compatibility with older Android versions.
Each subdirectory of the `compatLib`, denoted by a letter (e.g., `compatLibVQ` for Android 10),
refers to the compatibility code for that specific Android version.
Starting with Android 16 and above, the `compatLib` will denoted by the codename of the Android version
(e.g., `compatLibVBaklava` for Android 16).
| Library | Android version |
|-------------------|-----------------|
| compatLibVQ | 10 |
| compatLibVR | 11 |
| compatLibVS | 12 |
| compatLibVT | 13 |
| compatLibVU | 14 |
| compatLibVV | 15 |
| compatLibVBaklava | 16 |
Keep in mind that this list does not guarantee Recents compatibility with your Android versions,
as the implementation may still be in progress or not fully functional.
| Library | Android version |
|-------------|-----------------|
| compatLibVQ | 10 |
| compatLibVR | 11 |
| compatLibVS | 12 |
| compatLibVT | 13 |
| compatLibVU | 14 |
| compatLibVV | 15 |
-1
View File
@@ -3,7 +3,6 @@ plugins {
}
android {
buildToolsVersion "36.1.0"
namespace "app.lawnchair.compatlib"
buildFeatures {
+12 -10
View File
@@ -1,19 +1,21 @@
# Lawnchair Assets Guidelines
# Lawnchair Visual Guidelines
This directory lists all the decoration & visual explainers used in the Lawnchair Documentation.
All assets created should use Material 3 design with `#47B84F` as source color, and
All assets created should use Material 3 design with `#47B84F` as source color and
the [Inter](https://fonts.google.com/specimen/Inter) ([OFL v1.1](https://github.com/rsms/inter/?tab=OFL-1.1-1-ov-file#readme))
typography.
typography. Visit the [Material 3 theme builder][material-theme-builder] for more information.
Visit the [Material 3 theme builder][material-theme-builder] for more information on color.
When creating device mockups for Lawnchair, make sure that you're using the latest commits of
Lawnchair or use Lawnchair Nightly as base.
## Device mockup
## Device Mockup
When creating device mockups for Lawnchair, make sure the latest stable commits of Lawnchair is use
as base. All wallpapers, fonts and icon packs are allowed as long as they're free-to-use
under a permissive license like the licenses from Creative-Common. Using vanilla out-of-the-box
experience is recommended because they show the user what to expect from Lawnchair Launcher when
they first use it.
Use in: [README](/README.md)
* Icon pack: [Lawnicons](https://github.com/LawnchairLauncher/lawnicons)
* Wallpaper: https://unsplash.com/photos/photography-of-green-leaves-ZVKr8wADhpc
* Color Extraction Technique: Tonal Spot from Lawnchair
* License: https://unsplash.com/license
[material-theme-builder]: https://material-foundation.github.io/material-theme-builder/?primary=%2347B84F&bodyFont=Inter&displayFont=Inter&colorMatch=false
Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 35 KiB

@@ -1 +1 @@
Homescreen based on Launcher3 from AOSP
Homescreen based on on Launcher3 from AOSP
+1 -1
View File
@@ -12,5 +12,5 @@ android {
}
}
addFrameworkJar('framework-16.jar')
addFrameworkJar('framework-15.jar')
compileOnlyCommonJars()
File diff suppressed because it is too large Load Diff
@@ -3,6 +3,7 @@ package com.android.launcher3;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/** @hide */
public class FakeFeatureFlagsImpl extends CustomFeatureFlags {
private final Map<String, Boolean> mFlagMap = new HashMap<>();
@@ -1,348 +1,103 @@
package com.android.launcher3;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public interface FeatureFlags {
boolean accessibilityScrollOnAllapps();
boolean allAppsBlur();
boolean allAppsSheetForHandheld();
boolean coordinateWorkspaceScale();
boolean enableActiveGestureProtoLog();
boolean enableAddAppWidgetViaConfigActivityV2();
boolean enableAdditionalHomeAnimations();
boolean enableAllAppsButtonInHotseat();
boolean enableAltTabKqsFlatenning();
boolean enableAltTabKqsOnConnectedDisplays();
boolean enableCategorizedWidgetSuggestions();
boolean enableContainerReturnAnimations();
boolean enableContrastTiles();
boolean enableCursorHoverStates();
boolean enableDesktopExplodedView();
boolean enableDesktopTaskAlphaAnimation();
boolean enableDesktopWindowingCarouselDetach();
boolean enableDismissPredictionUndo();
boolean enableExpandingPauseWorkButton();
boolean enableExpressiveDismissTaskMotion();
boolean enableFallbackOverviewInWindow();
boolean enableFirstScreenBroadcastArchivingExtras();
boolean enableFocusOutline();
boolean enableGeneratedPreviews();
boolean enableGestureNavHorizontalTouchSlop();
boolean enableGestureNavOnConnectedDisplays();
boolean enableGridMigrationFix();
boolean enableGridOnlyOverview();
boolean enableGrowthNudge();
boolean enableHandleDelayedGestureCallbacks();
boolean enableHomeTransitionListener();
boolean enableHoverOfChildElementsInTaskview();
boolean enableLargeDesktopWindowingTile();
boolean enableLauncherBrMetricsFixed();
boolean enableLauncherIconShapes();
boolean enableLauncherOverviewInWindow();
boolean enableLauncherVisualRefresh();
boolean enableMouseInteractionChanges();
boolean enableMultiInstanceMenuTaskbar();
boolean enableNarrowGridRestore();
boolean enableOverviewBackgroundWallpaperBlur();
boolean enableOverviewCommandHelperTimeout();
boolean enableOverviewDesktopTileWallpaperBackground();
boolean enableOverviewIconMenu();
boolean enableOverviewOnConnectedDisplays();
boolean enablePinningAppWithContextMenu();
boolean enablePredictiveBackGesture();
boolean enablePrivateSpace();
boolean enablePrivateSpaceInstallShortcut();
boolean enableRebootUnlockAnimation();
boolean enableRecentsInTaskbar();
boolean enableRecentsWindowProtoLog();
boolean enableRefactorTaskThumbnail();
boolean enableResponsiveWorkspace();
boolean enableScalabilityForDesktopExperience();
boolean enableScalingRevealHomeAnimation();
boolean enableSeparateExternalDisplayTasks();
boolean enableShortcutDontSuggestApp();
boolean enableShowEnabledShortcutsInAccessibilityMenu();
boolean enableSmartspaceAsAWidget();
boolean enableSmartspaceRemovalToggle();
boolean enableStateManagerProtoLog();
boolean enableStrictMode();
boolean enableSupportForArchiving();
boolean enableTabletTwoPanePickerV2();
boolean enableTaskbarBehindShade();
boolean enableTaskbarCustomization();
boolean enableTaskbarForDirectBoot();
boolean enableTaskbarNoRecreate();
boolean enableTaskbarPinning();
boolean enableTieredWidgetsByDefaultInPicker();
boolean enableTwoPaneLauncherSettings();
boolean enableTwolineAllapps();
boolean enableTwolineToggle();
boolean enableUnfoldStateAnimation();
boolean enableUnfoldedTwoPanePicker();
boolean enableUseTopVisibleActivityForExcludeFromRecentTask();
boolean enableWidgetTapToAdd();
boolean enableWorkspaceInflation();
boolean enabledFoldersInAllApps();
boolean expressiveThemeInTaskbarAndNavigation();
boolean extendibleThemeManager();
boolean floatingSearchBar();
boolean forceMonochromeAppIcons();
boolean gridMigrationRefactor();
boolean gsfRes();
boolean ignoreThreeFingerTrackpadForNavHandleLongPress();
boolean letterFastScroller();
boolean msdlFeedback();
boolean multilineSearchBar();
boolean navigateToChildPreference();
boolean oneGridMountedMode();
boolean oneGridRotationHandling();
boolean oneGridSpecs();
boolean predictiveBackToHomeBlur();
boolean predictiveBackToHomePolish();
boolean privateSpaceAddFloatingMaskView();
boolean privateSpaceAnimation();
boolean privateSpaceAppInstallerButton();
boolean privateSpaceRestrictAccessibilityDrag();
boolean privateSpaceRestrictItemDrag();
boolean privateSpaceSysAppsSeparation();
boolean removeAppsRefreshOnRightClick();
boolean removeExcludeFromScreenMagnificationFlagUsage();
boolean restoreArchivedAppIconsFromDb();
boolean restoreArchivedShortcuts();
boolean showTaskbarPinningPopupFromAnywhere();
boolean syncAppLaunchWithTaskbarStash();
boolean taskbarOverflow();
boolean taskbarQuietModeChangeSupport();
boolean useActivityOverlay();
boolean useNewIconForArchivedApps();
boolean useSystemRadiusForAppWidgets();
boolean workSchedulerInWorkProfile();
}
}
File diff suppressed because it is too large Load Diff
+1 -620
View File
@@ -1,49 +1,18 @@
package com.android.launcher3;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public final class Flags {
/** @hide */
public static final String FLAG_ACCESSIBILITY_SCROLL_ON_ALLAPPS = "com.android.launcher3.accessibility_scroll_on_allapps";
/** @hide */
public static final String FLAG_ALL_APPS_BLUR = "com.android.launcher3.all_apps_blur";
/** @hide */
public static final String FLAG_ALL_APPS_SHEET_FOR_HANDHELD = "com.android.launcher3.all_apps_sheet_for_handheld";
/** @hide */
public static final String FLAG_COORDINATE_WORKSPACE_SCALE = "com.android.launcher3.coordinate_workspace_scale";
/** @hide */
public static final String FLAG_ENABLE_ACTIVE_GESTURE_PROTO_LOG = "com.android.launcher3.enable_active_gesture_proto_log";
/** @hide */
public static final String FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 = "com.android.launcher3.enable_add_app_widget_via_config_activity_v2";
/** @hide */
public static final String FLAG_ENABLE_ADDITIONAL_HOME_ANIMATIONS = "com.android.launcher3.enable_additional_home_animations";
/** @hide */
public static final String FLAG_ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT = "com.android.launcher3.enable_all_apps_button_in_hotseat";
/** @hide */
public static final String FLAG_ENABLE_ALT_TAB_KQS_FLATENNING = "com.android.launcher3.enable_alt_tab_kqs_flatenning";
/** @hide */
public static final String FLAG_ENABLE_ALT_TAB_KQS_ON_CONNECTED_DISPLAYS = "com.android.launcher3.enable_alt_tab_kqs_on_connected_displays";
/** @hide */
public static final String FLAG_ENABLE_CATEGORIZED_WIDGET_SUGGESTIONS = "com.android.launcher3.enable_categorized_widget_suggestions";
/** @hide */
public static final String FLAG_ENABLE_CONTAINER_RETURN_ANIMATIONS = "com.android.launcher3.enable_container_return_animations";
/** @hide */
public static final String FLAG_ENABLE_CONTRAST_TILES = "com.android.launcher3.enable_contrast_tiles";
/** @hide */
public static final String FLAG_ENABLE_CURSOR_HOVER_STATES = "com.android.launcher3.enable_cursor_hover_states";
/** @hide */
public static final String FLAG_ENABLE_DESKTOP_EXPLODED_VIEW = "com.android.launcher3.enable_desktop_exploded_view";
/** @hide */
public static final String FLAG_ENABLE_DESKTOP_TASK_ALPHA_ANIMATION = "com.android.launcher3.enable_desktop_task_alpha_animation";
/** @hide */
public static final String FLAG_ENABLE_DESKTOP_WINDOWING_CAROUSEL_DETACH = "com.android.launcher3.enable_desktop_windowing_carousel_detach";
/** @hide */
public static final String FLAG_ENABLE_DISMISS_PREDICTION_UNDO = "com.android.launcher3.enable_dismiss_prediction_undo";
/** @hide */
public static final String FLAG_ENABLE_EXPANDING_PAUSE_WORK_BUTTON = "com.android.launcher3.enable_expanding_pause_work_button";
/** @hide */
public static final String FLAG_ENABLE_EXPRESSIVE_DISMISS_TASK_MOTION = "com.android.launcher3.enable_expressive_dismiss_task_motion";
/** @hide */
public static final String FLAG_ENABLE_FALLBACK_OVERVIEW_IN_WINDOW = "com.android.launcher3.enable_fallback_overview_in_window";
/** @hide */
public static final String FLAG_ENABLE_FIRST_SCREEN_BROADCAST_ARCHIVING_EXTRAS = "com.android.launcher3.enable_first_screen_broadcast_archiving_extras";
@@ -52,50 +21,20 @@ public final class Flags {
/** @hide */
public static final String FLAG_ENABLE_GENERATED_PREVIEWS = "com.android.launcher3.enable_generated_previews";
/** @hide */
public static final String FLAG_ENABLE_GESTURE_NAV_HORIZONTAL_TOUCH_SLOP = "com.android.launcher3.enable_gesture_nav_horizontal_touch_slop";
/** @hide */
public static final String FLAG_ENABLE_GESTURE_NAV_ON_CONNECTED_DISPLAYS = "com.android.launcher3.enable_gesture_nav_on_connected_displays";
/** @hide */
public static final String FLAG_ENABLE_GRID_MIGRATION_FIX = "com.android.launcher3.enable_grid_migration_fix";
/** @hide */
public static final String FLAG_ENABLE_GRID_ONLY_OVERVIEW = "com.android.launcher3.enable_grid_only_overview";
/** @hide */
public static final String FLAG_ENABLE_GROWTH_NUDGE = "com.android.launcher3.enable_growth_nudge";
/** @hide */
public static final String FLAG_ENABLE_HANDLE_DELAYED_GESTURE_CALLBACKS = "com.android.launcher3.enable_handle_delayed_gesture_callbacks";
/** @hide */
public static final String FLAG_ENABLE_HOME_TRANSITION_LISTENER = "com.android.launcher3.enable_home_transition_listener";
/** @hide */
public static final String FLAG_ENABLE_HOVER_OF_CHILD_ELEMENTS_IN_TASKVIEW = "com.android.launcher3.enable_hover_of_child_elements_in_taskview";
/** @hide */
public static final String FLAG_ENABLE_LARGE_DESKTOP_WINDOWING_TILE = "com.android.launcher3.enable_large_desktop_windowing_tile";
/** @hide */
public static final String FLAG_ENABLE_LAUNCHER_BR_METRICS_FIXED = "com.android.launcher3.enable_launcher_br_metrics_fixed";
/** @hide */
public static final String FLAG_ENABLE_LAUNCHER_ICON_SHAPES = "com.android.launcher3.enable_launcher_icon_shapes";
/** @hide */
public static final String FLAG_ENABLE_LAUNCHER_OVERVIEW_IN_WINDOW = "com.android.launcher3.enable_launcher_overview_in_window";
/** @hide */
public static final String FLAG_ENABLE_LAUNCHER_VISUAL_REFRESH = "com.android.launcher3.enable_launcher_visual_refresh";
/** @hide */
public static final String FLAG_ENABLE_MOUSE_INTERACTION_CHANGES = "com.android.launcher3.enable_mouse_interaction_changes";
/** @hide */
public static final String FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR = "com.android.launcher3.enable_multi_instance_menu_taskbar";
/** @hide */
public static final String FLAG_ENABLE_NARROW_GRID_RESTORE = "com.android.launcher3.enable_narrow_grid_restore";
/** @hide */
public static final String FLAG_ENABLE_OVERVIEW_BACKGROUND_WALLPAPER_BLUR = "com.android.launcher3.enable_overview_background_wallpaper_blur";
/** @hide */
public static final String FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT = "com.android.launcher3.enable_overview_command_helper_timeout";
/** @hide */
public static final String FLAG_ENABLE_OVERVIEW_DESKTOP_TILE_WALLPAPER_BACKGROUND = "com.android.launcher3.enable_overview_desktop_tile_wallpaper_background";
/** @hide */
public static final String FLAG_ENABLE_OVERVIEW_ICON_MENU = "com.android.launcher3.enable_overview_icon_menu";
/** @hide */
public static final String FLAG_ENABLE_OVERVIEW_ON_CONNECTED_DISPLAYS = "com.android.launcher3.enable_overview_on_connected_displays";
/** @hide */
public static final String FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU = "com.android.launcher3.enable_pinning_app_with_context_menu";
/** @hide */
public static final String FLAG_ENABLE_PREDICTIVE_BACK_GESTURE = "com.android.launcher3.enable_predictive_back_gesture";
/** @hide */
public static final String FLAG_ENABLE_PRIVATE_SPACE = "com.android.launcher3.enable_private_space";
@@ -106,46 +45,28 @@ public final class Flags {
/** @hide */
public static final String FLAG_ENABLE_RECENTS_IN_TASKBAR = "com.android.launcher3.enable_recents_in_taskbar";
/** @hide */
public static final String FLAG_ENABLE_RECENTS_WINDOW_PROTO_LOG = "com.android.launcher3.enable_recents_window_proto_log";
/** @hide */
public static final String FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL = "com.android.launcher3.enable_refactor_task_thumbnail";
/** @hide */
public static final String FLAG_ENABLE_RESPONSIVE_WORKSPACE = "com.android.launcher3.enable_responsive_workspace";
/** @hide */
public static final String FLAG_ENABLE_SCALABILITY_FOR_DESKTOP_EXPERIENCE = "com.android.launcher3.enable_scalability_for_desktop_experience";
/** @hide */
public static final String FLAG_ENABLE_SCALING_REVEAL_HOME_ANIMATION = "com.android.launcher3.enable_scaling_reveal_home_animation";
/** @hide */
public static final String FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS = "com.android.launcher3.enable_separate_external_display_tasks";
/** @hide */
public static final String FLAG_ENABLE_SHORTCUT_DONT_SUGGEST_APP = "com.android.launcher3.enable_shortcut_dont_suggest_app";
/** @hide */
public static final String FLAG_ENABLE_SHOW_ENABLED_SHORTCUTS_IN_ACCESSIBILITY_MENU = "com.android.launcher3.enable_show_enabled_shortcuts_in_accessibility_menu";
/** @hide */
public static final String FLAG_ENABLE_SMARTSPACE_AS_A_WIDGET = "com.android.launcher3.enable_smartspace_as_a_widget";
/** @hide */
public static final String FLAG_ENABLE_SMARTSPACE_REMOVAL_TOGGLE = "com.android.launcher3.enable_smartspace_removal_toggle";
/** @hide */
public static final String FLAG_ENABLE_STATE_MANAGER_PROTO_LOG = "com.android.launcher3.enable_state_manager_proto_log";
/** @hide */
public static final String FLAG_ENABLE_STRICT_MODE = "com.android.launcher3.enable_strict_mode";
/** @hide */
public static final String FLAG_ENABLE_SUPPORT_FOR_ARCHIVING = "com.android.launcher3.enable_support_for_archiving";
/** @hide */
public static final String FLAG_ENABLE_TABLET_TWO_PANE_PICKER_V2 = "com.android.launcher3.enable_tablet_two_pane_picker_v2";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_BEHIND_SHADE = "com.android.launcher3.enable_taskbar_behind_shade";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_CUSTOMIZATION = "com.android.launcher3.enable_taskbar_customization";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_FOR_DIRECT_BOOT = "com.android.launcher3.enable_taskbar_for_direct_boot";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_NO_RECREATE = "com.android.launcher3.enable_taskbar_no_recreate";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_PINNING = "com.android.launcher3.enable_taskbar_pinning";
/** @hide */
public static final String FLAG_ENABLE_TIERED_WIDGETS_BY_DEFAULT_IN_PICKER = "com.android.launcher3.enable_tiered_widgets_by_default_in_picker";
/** @hide */
public static final String FLAG_ENABLE_TWO_PANE_LAUNCHER_SETTINGS = "com.android.launcher3.enable_two_pane_launcher_settings";
/** @hide */
public static final String FLAG_ENABLE_TWOLINE_ALLAPPS = "com.android.launcher3.enable_twoline_allapps";
@@ -156,46 +77,16 @@ public final class Flags {
/** @hide */
public static final String FLAG_ENABLE_UNFOLDED_TWO_PANE_PICKER = "com.android.launcher3.enable_unfolded_two_pane_picker";
/** @hide */
public static final String FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK = "com.android.launcher3.enable_use_top_visible_activity_for_exclude_from_recent_task";
/** @hide */
public static final String FLAG_ENABLE_WIDGET_TAP_TO_ADD = "com.android.launcher3.enable_widget_tap_to_add";
/** @hide */
public static final String FLAG_ENABLE_WORKSPACE_INFLATION = "com.android.launcher3.enable_workspace_inflation";
/** @hide */
public static final String FLAG_ENABLED_FOLDERS_IN_ALL_APPS = "com.android.launcher3.enabled_folders_in_all_apps";
/** @hide */
public static final String FLAG_EXPRESSIVE_THEME_IN_TASKBAR_AND_NAVIGATION = "com.android.launcher3.expressive_theme_in_taskbar_and_navigation";
/** @hide */
public static final String FLAG_EXTENDIBLE_THEME_MANAGER = "com.android.launcher3.extendible_theme_manager";
/** @hide */
public static final String FLAG_FLOATING_SEARCH_BAR = "com.android.launcher3.floating_search_bar";
/** @hide */
public static final String FLAG_FORCE_MONOCHROME_APP_ICONS = "com.android.launcher3.force_monochrome_app_icons";
/** @hide */
public static final String FLAG_GRID_MIGRATION_REFACTOR = "com.android.launcher3.grid_migration_refactor";
/** @hide */
public static final String FLAG_GSF_RES = "com.android.launcher3.gsf_res";
/** @hide */
public static final String FLAG_IGNORE_THREE_FINGER_TRACKPAD_FOR_NAV_HANDLE_LONG_PRESS = "com.android.launcher3.ignore_three_finger_trackpad_for_nav_handle_long_press";
/** @hide */
public static final String FLAG_LETTER_FAST_SCROLLER = "com.android.launcher3.letter_fast_scroller";
/** @hide */
public static final String FLAG_MSDL_FEEDBACK = "com.android.launcher3.msdl_feedback";
/** @hide */
public static final String FLAG_MULTILINE_SEARCH_BAR = "com.android.launcher3.multiline_search_bar";
/** @hide */
public static final String FLAG_NAVIGATE_TO_CHILD_PREFERENCE = "com.android.launcher3.navigate_to_child_preference";
/** @hide */
public static final String FLAG_ONE_GRID_MOUNTED_MODE = "com.android.launcher3.one_grid_mounted_mode";
/** @hide */
public static final String FLAG_ONE_GRID_ROTATION_HANDLING = "com.android.launcher3.one_grid_rotation_handling";
/** @hide */
public static final String FLAG_ONE_GRID_SPECS = "com.android.launcher3.one_grid_specs";
/** @hide */
public static final String FLAG_PREDICTIVE_BACK_TO_HOME_BLUR = "com.android.launcher3.predictive_back_to_home_blur";
/** @hide */
public static final String FLAG_PREDICTIVE_BACK_TO_HOME_POLISH = "com.android.launcher3.predictive_back_to_home_polish";
/** @hide */
public static final String FLAG_PRIVATE_SPACE_ADD_FLOATING_MASK_VIEW = "com.android.launcher3.private_space_add_floating_mask_view";
/** @hide */
public static final String FLAG_PRIVATE_SPACE_ANIMATION = "com.android.launcher3.private_space_animation";
@@ -208,714 +99,204 @@ public final class Flags {
/** @hide */
public static final String FLAG_PRIVATE_SPACE_SYS_APPS_SEPARATION = "com.android.launcher3.private_space_sys_apps_separation";
/** @hide */
public static final String FLAG_REMOVE_APPS_REFRESH_ON_RIGHT_CLICK = "com.android.launcher3.remove_apps_refresh_on_right_click";
/** @hide */
public static final String FLAG_REMOVE_EXCLUDE_FROM_SCREEN_MAGNIFICATION_FLAG_USAGE = "com.android.launcher3.remove_exclude_from_screen_magnification_flag_usage";
/** @hide */
public static final String FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB = "com.android.launcher3.restore_archived_app_icons_from_db";
/** @hide */
public static final String FLAG_RESTORE_ARCHIVED_SHORTCUTS = "com.android.launcher3.restore_archived_shortcuts";
/** @hide */
public static final String FLAG_SHOW_TASKBAR_PINNING_POPUP_FROM_ANYWHERE = "com.android.launcher3.show_taskbar_pinning_popup_from_anywhere";
/** @hide */
public static final String FLAG_SYNC_APP_LAUNCH_WITH_TASKBAR_STASH = "com.android.launcher3.sync_app_launch_with_taskbar_stash";
/** @hide */
public static final String FLAG_TASKBAR_OVERFLOW = "com.android.launcher3.taskbar_overflow";
/** @hide */
public static final String FLAG_TASKBAR_QUIET_MODE_CHANGE_SUPPORT = "com.android.launcher3.taskbar_quiet_mode_change_support";
/** @hide */
public static final String FLAG_USE_ACTIVITY_OVERLAY = "com.android.launcher3.use_activity_overlay";
/** @hide */
public static final String FLAG_USE_NEW_ICON_FOR_ARCHIVED_APPS = "com.android.launcher3.use_new_icon_for_archived_apps";
/** @hide */
public static final String FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS = "com.android.launcher3.use_system_radius_for_app_widgets";
/** @hide */
public static final String FLAG_WORK_SCHEDULER_IN_WORK_PROFILE = "com.android.launcher3.work_scheduler_in_work_profile";
public static boolean accessibilityScrollOnAllapps() {
return FEATURE_FLAGS.accessibilityScrollOnAllapps();
}
public static boolean allAppsBlur() {
return FEATURE_FLAGS.allAppsBlur();
}
public static boolean allAppsSheetForHandheld() {
return FEATURE_FLAGS.allAppsSheetForHandheld();
}
public static boolean coordinateWorkspaceScale() {
return FEATURE_FLAGS.coordinateWorkspaceScale();
}
public static boolean enableActiveGestureProtoLog() {
return FEATURE_FLAGS.enableActiveGestureProtoLog();
}
public static boolean enableAddAppWidgetViaConfigActivityV2() {
return FEATURE_FLAGS.enableAddAppWidgetViaConfigActivityV2();
}
public static boolean enableAdditionalHomeAnimations() {
return FEATURE_FLAGS.enableAdditionalHomeAnimations();
}
public static boolean enableAllAppsButtonInHotseat() {
return FEATURE_FLAGS.enableAllAppsButtonInHotseat();
}
public static boolean enableAltTabKqsFlatenning() {
return FEATURE_FLAGS.enableAltTabKqsFlatenning();
}
public static boolean enableAltTabKqsOnConnectedDisplays() {
return FEATURE_FLAGS.enableAltTabKqsOnConnectedDisplays();
}
public static boolean enableCategorizedWidgetSuggestions() {
return FEATURE_FLAGS.enableCategorizedWidgetSuggestions();
}
public static boolean enableContainerReturnAnimations() {
return FEATURE_FLAGS.enableContainerReturnAnimations();
}
public static boolean enableContrastTiles() {
return FEATURE_FLAGS.enableContrastTiles();
}
public static boolean enableCursorHoverStates() {
return FEATURE_FLAGS.enableCursorHoverStates();
}
public static boolean enableDesktopExplodedView() {
return FEATURE_FLAGS.enableDesktopExplodedView();
}
public static boolean enableDesktopTaskAlphaAnimation() {
return FEATURE_FLAGS.enableDesktopTaskAlphaAnimation();
}
public static boolean enableDesktopWindowingCarouselDetach() {
return FEATURE_FLAGS.enableDesktopWindowingCarouselDetach();
}
public static boolean enableDismissPredictionUndo() {
return FEATURE_FLAGS.enableDismissPredictionUndo();
}
public static boolean enableExpandingPauseWorkButton() {
return FEATURE_FLAGS.enableExpandingPauseWorkButton();
}
public static boolean enableExpressiveDismissTaskMotion() {
return FEATURE_FLAGS.enableExpressiveDismissTaskMotion();
}
public static boolean enableFallbackOverviewInWindow() {
return FEATURE_FLAGS.enableFallbackOverviewInWindow();
}
public static boolean enableFirstScreenBroadcastArchivingExtras() {
return FEATURE_FLAGS.enableFirstScreenBroadcastArchivingExtras();
}
public static boolean enableFocusOutline() {
return FEATURE_FLAGS.enableFocusOutline();
}
public static boolean enableGeneratedPreviews() {
return FEATURE_FLAGS.enableGeneratedPreviews();
}
public static boolean enableGestureNavHorizontalTouchSlop() {
return FEATURE_FLAGS.enableGestureNavHorizontalTouchSlop();
}
public static boolean enableGestureNavOnConnectedDisplays() {
return FEATURE_FLAGS.enableGestureNavOnConnectedDisplays();
}
public static boolean enableGridMigrationFix() {
return FEATURE_FLAGS.enableGridMigrationFix();
}
public static boolean enableGridOnlyOverview() {
return FEATURE_FLAGS.enableGridOnlyOverview();
}
public static boolean enableGrowthNudge() {
return FEATURE_FLAGS.enableGrowthNudge();
}
public static boolean enableHandleDelayedGestureCallbacks() {
return FEATURE_FLAGS.enableHandleDelayedGestureCallbacks();
}
public static boolean enableHomeTransitionListener() {
return FEATURE_FLAGS.enableHomeTransitionListener();
}
public static boolean enableHoverOfChildElementsInTaskview() {
return FEATURE_FLAGS.enableHoverOfChildElementsInTaskview();
}
public static boolean enableLargeDesktopWindowingTile() {
return FEATURE_FLAGS.enableLargeDesktopWindowingTile();
}
public static boolean enableLauncherBrMetricsFixed() {
return FEATURE_FLAGS.enableLauncherBrMetricsFixed();
}
public static boolean enableLauncherIconShapes() {
return FEATURE_FLAGS.enableLauncherIconShapes();
}
public static boolean enableLauncherOverviewInWindow() {
return FEATURE_FLAGS.enableLauncherOverviewInWindow();
}
public static boolean enableLauncherVisualRefresh() {
return FEATURE_FLAGS.enableLauncherVisualRefresh();
}
public static boolean enableMouseInteractionChanges() {
return FEATURE_FLAGS.enableMouseInteractionChanges();
}
public static boolean enableMultiInstanceMenuTaskbar() {
return FEATURE_FLAGS.enableMultiInstanceMenuTaskbar();
}
public static boolean enableNarrowGridRestore() {
return FEATURE_FLAGS.enableNarrowGridRestore();
}
public static boolean enableOverviewBackgroundWallpaperBlur() {
return FEATURE_FLAGS.enableOverviewBackgroundWallpaperBlur();
}
public static boolean enableOverviewCommandHelperTimeout() {
return FEATURE_FLAGS.enableOverviewCommandHelperTimeout();
}
public static boolean enableOverviewDesktopTileWallpaperBackground() {
return FEATURE_FLAGS.enableOverviewDesktopTileWallpaperBackground();
}
public static boolean enableOverviewIconMenu() {
return FEATURE_FLAGS.enableOverviewIconMenu();
}
public static boolean enableOverviewOnConnectedDisplays() {
return FEATURE_FLAGS.enableOverviewOnConnectedDisplays();
}
public static boolean enablePinningAppWithContextMenu() {
return FEATURE_FLAGS.enablePinningAppWithContextMenu();
}
public static boolean enablePredictiveBackGesture() {
return FEATURE_FLAGS.enablePredictiveBackGesture();
}
public static boolean enablePrivateSpace() {
return FEATURE_FLAGS.enablePrivateSpace();
}
public static boolean enablePrivateSpaceInstallShortcut() {
return FEATURE_FLAGS.enablePrivateSpaceInstallShortcut();
}
public static boolean enableRebootUnlockAnimation() {
return FEATURE_FLAGS.enableRebootUnlockAnimation();
}
public static boolean enableRecentsInTaskbar() {
return FEATURE_FLAGS.enableRecentsInTaskbar();
}
public static boolean enableRecentsWindowProtoLog() {
return FEATURE_FLAGS.enableRecentsWindowProtoLog();
}
public static boolean enableRefactorTaskThumbnail() {
return FEATURE_FLAGS.enableRefactorTaskThumbnail();
}
public static boolean enableResponsiveWorkspace() {
return FEATURE_FLAGS.enableResponsiveWorkspace();
}
public static boolean enableScalabilityForDesktopExperience() {
return FEATURE_FLAGS.enableScalabilityForDesktopExperience();
}
public static boolean enableScalingRevealHomeAnimation() {
return FEATURE_FLAGS.enableScalingRevealHomeAnimation();
}
public static boolean enableSeparateExternalDisplayTasks() {
return FEATURE_FLAGS.enableSeparateExternalDisplayTasks();
}
public static boolean enableShortcutDontSuggestApp() {
return FEATURE_FLAGS.enableShortcutDontSuggestApp();
}
public static boolean enableShowEnabledShortcutsInAccessibilityMenu() {
return FEATURE_FLAGS.enableShowEnabledShortcutsInAccessibilityMenu();
}
public static boolean enableSmartspaceAsAWidget() {
return FEATURE_FLAGS.enableSmartspaceAsAWidget();
}
public static boolean enableSmartspaceRemovalToggle() {
return FEATURE_FLAGS.enableSmartspaceRemovalToggle();
}
public static boolean enableStateManagerProtoLog() {
return FEATURE_FLAGS.enableStateManagerProtoLog();
}
public static boolean enableStrictMode() {
return FEATURE_FLAGS.enableStrictMode();
}
public static boolean enableSupportForArchiving() {
return FEATURE_FLAGS.enableSupportForArchiving();
}
public static boolean enableTabletTwoPanePickerV2() {
return FEATURE_FLAGS.enableTabletTwoPanePickerV2();
}
public static boolean enableTaskbarBehindShade() {
return FEATURE_FLAGS.enableTaskbarBehindShade();
}
public static boolean enableTaskbarCustomization() {
return FEATURE_FLAGS.enableTaskbarCustomization();
}
public static boolean enableTaskbarForDirectBoot() {
return FEATURE_FLAGS.enableTaskbarForDirectBoot();
}
public static boolean enableTaskbarNoRecreate() {
return FEATURE_FLAGS.enableTaskbarNoRecreate();
}
public static boolean enableTaskbarPinning() {
return FEATURE_FLAGS.enableTaskbarPinning();
}
public static boolean enableTieredWidgetsByDefaultInPicker() {
return FEATURE_FLAGS.enableTieredWidgetsByDefaultInPicker();
}
public static boolean enableTwoPaneLauncherSettings() {
return FEATURE_FLAGS.enableTwoPaneLauncherSettings();
}
public static boolean enableTwolineAllapps() {
return FEATURE_FLAGS.enableTwolineAllapps();
}
public static boolean enableTwolineToggle() {
return FEATURE_FLAGS.enableTwolineToggle();
}
public static boolean enableUnfoldStateAnimation() {
return FEATURE_FLAGS.enableUnfoldStateAnimation();
}
public static boolean enableUnfoldedTwoPanePicker() {
return FEATURE_FLAGS.enableUnfoldedTwoPanePicker();
}
public static boolean enableUseTopVisibleActivityForExcludeFromRecentTask() {
return FEATURE_FLAGS.enableUseTopVisibleActivityForExcludeFromRecentTask();
}
public static boolean enableWidgetTapToAdd() {
return FEATURE_FLAGS.enableWidgetTapToAdd();
}
public static boolean enableWorkspaceInflation() {
return FEATURE_FLAGS.enableWorkspaceInflation();
}
public static boolean enabledFoldersInAllApps() {
return FEATURE_FLAGS.enabledFoldersInAllApps();
}
public static boolean expressiveThemeInTaskbarAndNavigation() {
return FEATURE_FLAGS.expressiveThemeInTaskbarAndNavigation();
}
public static boolean extendibleThemeManager() {
return FEATURE_FLAGS.extendibleThemeManager();
}
public static boolean floatingSearchBar() {
return FEATURE_FLAGS.floatingSearchBar();
}
public static boolean forceMonochromeAppIcons() {
return FEATURE_FLAGS.forceMonochromeAppIcons();
}
public static boolean gridMigrationRefactor() {
return FEATURE_FLAGS.gridMigrationRefactor();
}
public static boolean gsfRes() {
return FEATURE_FLAGS.gsfRes();
}
public static boolean ignoreThreeFingerTrackpadForNavHandleLongPress() {
return FEATURE_FLAGS.ignoreThreeFingerTrackpadForNavHandleLongPress();
}
public static boolean letterFastScroller() {
return FEATURE_FLAGS.letterFastScroller();
}
public static boolean msdlFeedback() {
return FEATURE_FLAGS.msdlFeedback();
}
public static boolean multilineSearchBar() {
return FEATURE_FLAGS.multilineSearchBar();
}
public static boolean navigateToChildPreference() {
return FEATURE_FLAGS.navigateToChildPreference();
}
public static boolean oneGridMountedMode() {
return FEATURE_FLAGS.oneGridMountedMode();
}
public static boolean oneGridRotationHandling() {
return FEATURE_FLAGS.oneGridRotationHandling();
}
public static boolean oneGridSpecs() {
return FEATURE_FLAGS.oneGridSpecs();
}
public static boolean predictiveBackToHomeBlur() {
return FEATURE_FLAGS.predictiveBackToHomeBlur();
}
public static boolean predictiveBackToHomePolish() {
return FEATURE_FLAGS.predictiveBackToHomePolish();
}
public static boolean privateSpaceAddFloatingMaskView() {
return FEATURE_FLAGS.privateSpaceAddFloatingMaskView();
}
public static boolean privateSpaceAnimation() {
return FEATURE_FLAGS.privateSpaceAnimation();
}
public static boolean privateSpaceAppInstallerButton() {
return FEATURE_FLAGS.privateSpaceAppInstallerButton();
}
public static boolean privateSpaceRestrictAccessibilityDrag() {
return FEATURE_FLAGS.privateSpaceRestrictAccessibilityDrag();
}
public static boolean privateSpaceRestrictItemDrag() {
return FEATURE_FLAGS.privateSpaceRestrictItemDrag();
}
public static boolean privateSpaceSysAppsSeparation() {
return FEATURE_FLAGS.privateSpaceSysAppsSeparation();
}
public static boolean removeAppsRefreshOnRightClick() {
return FEATURE_FLAGS.removeAppsRefreshOnRightClick();
}
public static boolean removeExcludeFromScreenMagnificationFlagUsage() {
return FEATURE_FLAGS.removeExcludeFromScreenMagnificationFlagUsage();
}
public static boolean restoreArchivedAppIconsFromDb() {
return FEATURE_FLAGS.restoreArchivedAppIconsFromDb();
}
public static boolean restoreArchivedShortcuts() {
return FEATURE_FLAGS.restoreArchivedShortcuts();
}
public static boolean showTaskbarPinningPopupFromAnywhere() {
return FEATURE_FLAGS.showTaskbarPinningPopupFromAnywhere();
}
public static boolean syncAppLaunchWithTaskbarStash() {
return FEATURE_FLAGS.syncAppLaunchWithTaskbarStash();
}
public static boolean taskbarOverflow() {
return FEATURE_FLAGS.taskbarOverflow();
}
public static boolean taskbarQuietModeChangeSupport() {
return FEATURE_FLAGS.taskbarQuietModeChangeSupport();
}
public static boolean useActivityOverlay() {
return FEATURE_FLAGS.useActivityOverlay();
}
public static boolean useNewIconForArchivedApps() {
return FEATURE_FLAGS.useNewIconForArchivedApps();
}
public static boolean useSystemRadiusForAppWidgets() {
return FEATURE_FLAGS.useSystemRadiusForAppWidgets();
}
public static boolean workSchedulerInWorkProfile() {
return FEATURE_FLAGS.workSchedulerInWorkProfile();
}
private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
}
}
@@ -20,72 +20,61 @@ import android.app.ActivityThread
import android.content.Context
import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.provider.DeviceConfig
import android.provider.DeviceConfig.OnPropertiesChangedListener
import android.provider.DeviceConfig.Properties
import androidx.annotation.WorkerThread
import java.util.concurrent.CopyOnWriteArrayList
/** Utility class to manage a set of device configurations */
class DeviceConfigHelper<ConfigType>(private val factory: (PropReader) -> ConfigType) {
var config: ConfigType
private set
private val allKeys: Set<String>
private val propertiesListener = OnPropertiesChangedListener { onDevicePropsChanges(it) }
private val sharedPrefChangeListener = OnSharedPreferenceChangeListener { _, _ ->
recreateConfig()
}
private val changeListeners = CopyOnWriteArrayList<Runnable>()
private val changeListeners = mutableListOf<Runnable>()
init {
// Initialize the default config once.
allKeys = HashSet()
config =
factory(
PropReader(
object : PropProvider {
override fun <T : Any> get(key: String, fallback: T): T {
val prefs = prefs
if (fallback is Int) {
allKeys.add(key)
return prefs.getInt(key, fallback) as T
} else if (fallback is Boolean) {
allKeys.add(key)
return prefs.getBoolean(key, fallback) as T
} else return fallback
config = factory(
PropReader(
object : PropProvider {
override fun <T : Any> get(key: String, fallback: T): T {
val prefs = prefs
allKeys.add(key)
return when (fallback) {
is Int -> prefs.getInt(key, fallback) as T
is Boolean -> prefs.getBoolean(key, fallback) as T
else -> fallback
}
}
)
}
)
)
prefs.registerOnSharedPreferenceChangeListener(sharedPrefChangeListener)
}
@WorkerThread
private fun onDevicePropsChanges(properties: Properties) {
if (NAMESPACE_LAUNCHER != properties.namespace) return
if (!allKeys.any(properties.keyset::contains)) return
private fun onDevicePropsChanges() {
recreateConfig()
}
private fun recreateConfig() {
val myProps =
DeviceConfig.getProperties(NAMESPACE_LAUNCHER, *allKeys.toTypedArray<String>())
config =
factory(
PropReader(
object : PropProvider {
override fun <T : Any> get(key: String, fallback: T): T {
if (fallback is Int) return myProps.getInt(key, fallback) as T
else if (fallback is Boolean)
return myProps.getBoolean(key, fallback) as T
else return fallback
config = factory(
PropReader(
object : PropProvider {
override fun <T : Any> get(key: String, fallback: T): T {
return when (fallback) {
is Int -> prefs.getInt(key, fallback) as T
is Boolean -> prefs.getBoolean(key, fallback) as T
else -> fallback
}
}
)
}
)
)
}
/** Adds a listener for property changes */
@@ -95,7 +84,6 @@ class DeviceConfigHelper<ConfigType>(private val factory: (PropReader) -> Config
fun removeChangeListener(r: Runnable) = changeListeners.remove(r)
fun close() {
DeviceConfig.removeOnPropertiesChangedListener(propertiesListener)
prefs.unregisterOnSharedPreferenceChangeListener(sharedPrefChangeListener)
}
File diff suppressed because it is too large Load Diff
@@ -3,6 +3,7 @@ package com.android.systemui;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/** @hide */
public class FakeFeatureFlagsImpl extends CustomFeatureFlags {
private final Map<String, Boolean> mFlagMap = new HashMap<>();
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,13 +1,13 @@
package com.android.systemui.shared;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
/** @hide */
public class CustomFeatureFlags implements FeatureFlags {
@@ -17,182 +17,56 @@ public class CustomFeatureFlags implements FeatureFlags {
mGetValueImpl = getValueImpl;
}
@Override
public boolean ambientAod() {
return getValue(Flags.FLAG_AMBIENT_AOD,
FeatureFlags::ambientAod);
}
@Override
public boolean bouncerAreaExclusion() {
return getValue(Flags.FLAG_BOUNCER_AREA_EXCLUSION,
FeatureFlags::bouncerAreaExclusion);
FeatureFlags::bouncerAreaExclusion);
}
@Override
public boolean clockReactiveSmartspaceLayout() {
return getValue(Flags.FLAG_CLOCK_REACTIVE_SMARTSPACE_LAYOUT,
FeatureFlags::clockReactiveSmartspaceLayout);
}
@Override
public boolean clockReactiveVariants() {
return getValue(Flags.FLAG_CLOCK_REACTIVE_VARIANTS,
FeatureFlags::clockReactiveVariants);
}
@Override
public boolean cursorHotCorner() {
return getValue(Flags.FLAG_CURSOR_HOT_CORNER,
FeatureFlags::cursorHotCorner);
}
@Override
public boolean enableHomeDelay() {
return getValue(Flags.FLAG_ENABLE_HOME_DELAY,
FeatureFlags::enableHomeDelay);
FeatureFlags::enableHomeDelay);
}
@Override
public boolean enableLppSqueezeEffect() {
return getValue(Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT,
FeatureFlags::enableLppSqueezeEffect);
}
@Override
public boolean exampleSharedFlag() {
return getValue(Flags.FLAG_EXAMPLE_SHARED_FLAG,
FeatureFlags::exampleSharedFlag);
FeatureFlags::exampleSharedFlag);
}
@Override
public boolean extendedWallpaperEffects() {
return getValue(Flags.FLAG_EXTENDED_WALLPAPER_EFFECTS,
FeatureFlags::extendedWallpaperEffects);
}
@Override
public boolean lockscreenCustomClocks() {
return getValue(Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS,
FeatureFlags::lockscreenCustomClocks);
}
@Override
public boolean newCustomizationPickerUi() {
return getValue(Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI,
FeatureFlags::newCustomizationPickerUi);
}
@Override
public boolean newTouchpadGesturesTutorial() {
return getValue(Flags.FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL,
FeatureFlags::newTouchpadGesturesTutorial);
}
@Override
public boolean returnAnimationFrameworkLibrary() {
return getValue(Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
FeatureFlags::returnAnimationFrameworkLibrary);
FeatureFlags::returnAnimationFrameworkLibrary);
}
@Override
public boolean returnAnimationFrameworkLongLived() {
return getValue(Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED,
FeatureFlags::returnAnimationFrameworkLongLived);
}
@Override
public boolean screenshotContextUrl() {
return getValue(Flags.FLAG_SCREENSHOT_CONTEXT_URL,
FeatureFlags::screenshotContextUrl);
}
@Override
public boolean shadeAllowBackGesture() {
return getValue(Flags.FLAG_SHADE_ALLOW_BACK_GESTURE,
FeatureFlags::shadeAllowBackGesture);
FeatureFlags::shadeAllowBackGesture);
}
@Override
public boolean sidefpsControllerRefactor() {
return getValue(Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR,
FeatureFlags::sidefpsControllerRefactor);
}
@Override
public boolean smartspaceRemoteviewsIntentHandler() {
return getValue(Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER,
FeatureFlags::smartspaceRemoteviewsIntentHandler);
}
@Override
public boolean smartspaceSportsCardBackground() {
return getValue(Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND,
FeatureFlags::smartspaceSportsCardBackground);
}
@Override
public boolean smartspaceUiUpdate() {
return getValue(Flags.FLAG_SMARTSPACE_UI_UPDATE,
FeatureFlags::smartspaceUiUpdate);
}
@Override
public boolean smartspaceUiUpdateResources() {
return getValue(Flags.FLAG_SMARTSPACE_UI_UPDATE_RESOURCES,
FeatureFlags::smartspaceUiUpdateResources);
}
@Override
public boolean statusBarConnectedDisplays() {
return getValue(Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS,
FeatureFlags::statusBarConnectedDisplays);
}
@Override
public boolean threeButtonCornerSwipe() {
return getValue(Flags.FLAG_THREE_BUTTON_CORNER_SWIPE,
FeatureFlags::threeButtonCornerSwipe);
}
@Override
public boolean usePreferredImageEditor() {
return getValue(Flags.FLAG_USE_PREFERRED_IMAGE_EDITOR,
FeatureFlags::usePreferredImageEditor);
FeatureFlags::sidefpsControllerRefactor);
}
public boolean isFlagReadOnlyOptimized(String flagName) {
if (mReadOnlyFlagsSet.contains(flagName) &&
isOptimizationEnabled()) {
return true;
isOptimizationEnabled()) {
return true;
}
return false;
}
private boolean isOptimizationEnabled() {
return false;
}
@@ -203,60 +77,18 @@ public class CustomFeatureFlags implements FeatureFlags {
public List<String> getFlagNames() {
return Arrays.asList(
Flags.FLAG_AMBIENT_AOD,
Flags.FLAG_BOUNCER_AREA_EXCLUSION,
Flags.FLAG_CLOCK_REACTIVE_SMARTSPACE_LAYOUT,
Flags.FLAG_CLOCK_REACTIVE_VARIANTS,
Flags.FLAG_CURSOR_HOT_CORNER,
Flags.FLAG_ENABLE_HOME_DELAY,
Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT,
Flags.FLAG_EXAMPLE_SHARED_FLAG,
Flags.FLAG_EXTENDED_WALLPAPER_EFFECTS,
Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS,
Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI,
Flags.FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL,
Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED,
Flags.FLAG_SCREENSHOT_CONTEXT_URL,
Flags.FLAG_SHADE_ALLOW_BACK_GESTURE,
Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR,
Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER,
Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND,
Flags.FLAG_SMARTSPACE_UI_UPDATE,
Flags.FLAG_SMARTSPACE_UI_UPDATE_RESOURCES,
Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS,
Flags.FLAG_THREE_BUTTON_CORNER_SWIPE,
Flags.FLAG_USE_PREFERRED_IMAGE_EDITOR
Flags.FLAG_BOUNCER_AREA_EXCLUSION,
Flags.FLAG_ENABLE_HOME_DELAY,
Flags.FLAG_EXAMPLE_SHARED_FLAG,
Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
Flags.FLAG_SHADE_ALLOW_BACK_GESTURE,
Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
);
}
private Set<String> mReadOnlyFlagsSet = new HashSet<>(
Arrays.asList(
Flags.FLAG_AMBIENT_AOD,
Flags.FLAG_BOUNCER_AREA_EXCLUSION,
Flags.FLAG_CLOCK_REACTIVE_SMARTSPACE_LAYOUT,
Flags.FLAG_CLOCK_REACTIVE_VARIANTS,
Flags.FLAG_CURSOR_HOT_CORNER,
Flags.FLAG_ENABLE_HOME_DELAY,
Flags.FLAG_ENABLE_LPP_SQUEEZE_EFFECT,
Flags.FLAG_EXAMPLE_SHARED_FLAG,
Flags.FLAG_EXTENDED_WALLPAPER_EFFECTS,
Flags.FLAG_LOCKSCREEN_CUSTOM_CLOCKS,
Flags.FLAG_NEW_CUSTOMIZATION_PICKER_UI,
Flags.FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL,
Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED,
Flags.FLAG_SCREENSHOT_CONTEXT_URL,
Flags.FLAG_SHADE_ALLOW_BACK_GESTURE,
Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR,
Flags.FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER,
Flags.FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND,
Flags.FLAG_SMARTSPACE_UI_UPDATE,
Flags.FLAG_SMARTSPACE_UI_UPDATE_RESOURCES,
Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS,
Flags.FLAG_THREE_BUTTON_CORNER_SWIPE,
Flags.FLAG_USE_PREFERRED_IMAGE_EDITOR,
""
)
Arrays.asList(
""
)
);
}
@@ -3,6 +3,7 @@ package com.android.systemui.shared;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/** @hide */
public class FakeFeatureFlagsImpl extends CustomFeatureFlags {
private final Map<String, Boolean> mFlagMap = new HashMap<>();
@@ -1,103 +1,24 @@
package com.android.systemui.shared;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public interface FeatureFlags {
boolean ambientAod();
boolean bouncerAreaExclusion();
boolean clockReactiveSmartspaceLayout();
boolean clockReactiveVariants();
boolean cursorHotCorner();
boolean enableHomeDelay();
boolean enableLppSqueezeEffect();
boolean exampleSharedFlag();
boolean extendedWallpaperEffects();
boolean lockscreenCustomClocks();
boolean newCustomizationPickerUi();
boolean newTouchpadGesturesTutorial();
boolean returnAnimationFrameworkLibrary();
boolean returnAnimationFrameworkLongLived();
boolean screenshotContextUrl();
boolean shadeAllowBackGesture();
boolean sidefpsControllerRefactor();
boolean smartspaceRemoteviewsIntentHandler();
boolean smartspaceSportsCardBackground();
boolean smartspaceUiUpdate();
boolean smartspaceUiUpdateResources();
boolean statusBarConnectedDisplays();
boolean threeButtonCornerSwipe();
boolean usePreferredImageEditor();
}
@@ -1,174 +1,195 @@
package com.android.systemui.shared;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import com.android.quickstep.util.DeviceConfigHelper;
import java.nio.file.Files;
import java.nio.file.Paths;
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags {
@Override
private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage"));
private static volatile boolean isCached = false;
private static volatile boolean biometrics_framework_is_cached = false;
private static volatile boolean systemui_is_cached = false;
private static boolean bouncerAreaExclusion = true;
private static boolean enableHomeDelay = false;
private static boolean exampleSharedFlag = false;
private static boolean returnAnimationFrameworkLibrary = false;
private static boolean shadeAllowBackGesture = false;
private static boolean sidefpsControllerRefactor = true;
public boolean ambientAod() {
return false;
private void init() {
boolean foundPackage = true;
sidefpsControllerRefactor = foundPackage;
bouncerAreaExclusion = foundPackage;
enableHomeDelay = foundPackage;
exampleSharedFlag = foundPackage;
returnAnimationFrameworkLibrary = foundPackage ;
shadeAllowBackGesture = foundPackage;
isCached = true;
}
private void load_overrides_biometrics_framework() {
try {
var properties = DeviceConfigHelper.Companion.getPrefs();
sidefpsControllerRefactor =
properties.getBoolean(Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR, true);
} catch (NullPointerException e) {
throw new RuntimeException(
"Cannot read value from namespace biometrics_framework "
+ "from DeviceConfig. It could be that the code using flag "
+ "executed before SettingsProvider initialization. Please use "
+ "fixed read-only flag by adding is_fixed_read_only: true in "
+ "flag declaration.",
e
);
}
biometrics_framework_is_cached = true;
}
private void load_overrides_systemui() {
try {
var properties = DeviceConfigHelper.Companion.getPrefs();
bouncerAreaExclusion =
properties.getBoolean(Flags.FLAG_BOUNCER_AREA_EXCLUSION, true);
enableHomeDelay =
properties.getBoolean(Flags.FLAG_ENABLE_HOME_DELAY, false);
exampleSharedFlag =
properties.getBoolean(Flags.FLAG_EXAMPLE_SHARED_FLAG, false);
returnAnimationFrameworkLibrary =
properties.getBoolean(Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY, false);
shadeAllowBackGesture =
properties.getBoolean(Flags.FLAG_SHADE_ALLOW_BACK_GESTURE, false);
} catch (NullPointerException e) {
throw new RuntimeException(
"Cannot read value from namespace systemui "
+ "from DeviceConfig. It could be that the code using flag "
+ "executed before SettingsProvider initialization. Please use "
+ "fixed read-only flag by adding is_fixed_read_only: true in "
+ "flag declaration.",
e
);
}
systemui_is_cached = true;
}
@Override
public boolean bouncerAreaExclusion() {
return true;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!systemui_is_cached) {
load_overrides_systemui();
}
}
return bouncerAreaExclusion;
}
@Override
public boolean clockReactiveSmartspaceLayout() {
return false;
}
@Override
public boolean clockReactiveVariants() {
return false;
}
@Override
public boolean cursorHotCorner() {
return false;
}
@Override
public boolean enableHomeDelay() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!systemui_is_cached) {
load_overrides_systemui();
}
}
return enableHomeDelay;
}
@Override
public boolean enableLppSqueezeEffect() {
return false;
}
@Override
public boolean exampleSharedFlag() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!systemui_is_cached) {
load_overrides_systemui();
}
}
return exampleSharedFlag;
}
@Override
public boolean extendedWallpaperEffects() {
return false;
}
@Override
public boolean lockscreenCustomClocks() {
return false;
}
@Override
public boolean newCustomizationPickerUi() {
return false;
}
@Override
public boolean newTouchpadGesturesTutorial() {
return true;
}
@Override
public boolean returnAnimationFrameworkLibrary() {
return true;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!systemui_is_cached) {
load_overrides_systemui();
}
}
return returnAnimationFrameworkLibrary;
}
@Override
public boolean returnAnimationFrameworkLongLived() {
return true;
}
@Override
public boolean screenshotContextUrl() {
return false;
}
@Override
public boolean shadeAllowBackGesture() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!systemui_is_cached) {
load_overrides_systemui();
}
}
return shadeAllowBackGesture;
}
@Override
public boolean sidefpsControllerRefactor() {
return true;
}
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!biometrics_framework_is_cached) {
load_overrides_biometrics_framework();
}
}
return sidefpsControllerRefactor;
@Override
public boolean smartspaceRemoteviewsIntentHandler() {
return true;
}
@Override
public boolean smartspaceSportsCardBackground() {
return false;
}
@Override
public boolean smartspaceUiUpdate() {
return false;
}
@Override
public boolean smartspaceUiUpdateResources() {
return false;
}
@Override
public boolean statusBarConnectedDisplays() {
return false;
}
@Override
public boolean threeButtonCornerSwipe() {
return false;
}
@Override
public boolean usePreferredImageEditor() {
return false;
}
}
+12 -188
View File
@@ -1,226 +1,50 @@
package com.android.systemui.shared;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public final class Flags {
/** @hide */
public static final String FLAG_AMBIENT_AOD = "com.android.systemui.shared.ambient_aod";
/** @hide */
public static final String FLAG_BOUNCER_AREA_EXCLUSION = "com.android.systemui.shared.bouncer_area_exclusion";
/** @hide */
public static final String FLAG_CLOCK_REACTIVE_SMARTSPACE_LAYOUT = "com.android.systemui.shared.clock_reactive_smartspace_layout";
/** @hide */
public static final String FLAG_CLOCK_REACTIVE_VARIANTS = "com.android.systemui.shared.clock_reactive_variants";
/** @hide */
public static final String FLAG_CURSOR_HOT_CORNER = "com.android.systemui.shared.cursor_hot_corner";
/** @hide */
public static final String FLAG_ENABLE_HOME_DELAY = "com.android.systemui.shared.enable_home_delay";
/** @hide */
public static final String FLAG_ENABLE_LPP_SQUEEZE_EFFECT = "com.android.systemui.shared.enable_lpp_squeeze_effect";
/** @hide */
public static final String FLAG_EXAMPLE_SHARED_FLAG = "com.android.systemui.shared.example_shared_flag";
/** @hide */
public static final String FLAG_EXTENDED_WALLPAPER_EFFECTS = "com.android.systemui.shared.extended_wallpaper_effects";
/** @hide */
public static final String FLAG_LOCKSCREEN_CUSTOM_CLOCKS = "com.android.systemui.shared.lockscreen_custom_clocks";
/** @hide */
public static final String FLAG_NEW_CUSTOMIZATION_PICKER_UI = "com.android.systemui.shared.new_customization_picker_ui";
/** @hide */
public static final String FLAG_NEW_TOUCHPAD_GESTURES_TUTORIAL = "com.android.systemui.shared.new_touchpad_gestures_tutorial";
/** @hide */
public static final String FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY = "com.android.systemui.shared.return_animation_framework_library";
/** @hide */
public static final String FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED = "com.android.systemui.shared.return_animation_framework_long_lived";
/** @hide */
public static final String FLAG_SCREENSHOT_CONTEXT_URL = "com.android.systemui.shared.screenshot_context_url";
/** @hide */
public static final String FLAG_SHADE_ALLOW_BACK_GESTURE = "com.android.systemui.shared.shade_allow_back_gesture";
/** @hide */
public static final String FLAG_SIDEFPS_CONTROLLER_REFACTOR = "com.android.systemui.shared.sidefps_controller_refactor";
/** @hide */
public static final String FLAG_SMARTSPACE_REMOTEVIEWS_INTENT_HANDLER = "com.android.systemui.shared.smartspace_remoteviews_intent_handler";
/** @hide */
public static final String FLAG_SMARTSPACE_SPORTS_CARD_BACKGROUND = "com.android.systemui.shared.smartspace_sports_card_background";
/** @hide */
public static final String FLAG_SMARTSPACE_UI_UPDATE = "com.android.systemui.shared.smartspace_ui_update";
/** @hide */
public static final String FLAG_SMARTSPACE_UI_UPDATE_RESOURCES = "com.android.systemui.shared.smartspace_ui_update_resources";
/** @hide */
public static final String FLAG_STATUS_BAR_CONNECTED_DISPLAYS = "com.android.systemui.shared.status_bar_connected_displays";
/** @hide */
public static final String FLAG_THREE_BUTTON_CORNER_SWIPE = "com.android.systemui.shared.three_button_corner_swipe";
/** @hide */
public static final String FLAG_USE_PREFERRED_IMAGE_EDITOR = "com.android.systemui.shared.use_preferred_image_editor";
public static boolean ambientAod() {
return FEATURE_FLAGS.ambientAod();
}
public static boolean bouncerAreaExclusion() {
return FEATURE_FLAGS.bouncerAreaExclusion();
}
public static boolean clockReactiveSmartspaceLayout() {
return FEATURE_FLAGS.clockReactiveSmartspaceLayout();
}
public static boolean clockReactiveVariants() {
return FEATURE_FLAGS.clockReactiveVariants();
}
public static boolean cursorHotCorner() {
return FEATURE_FLAGS.cursorHotCorner();
}
public static boolean enableHomeDelay() {
return FEATURE_FLAGS.enableHomeDelay();
}
public static boolean enableLppSqueezeEffect() {
return FEATURE_FLAGS.enableLppSqueezeEffect();
}
public static boolean exampleSharedFlag() {
return FEATURE_FLAGS.exampleSharedFlag();
}
public static boolean extendedWallpaperEffects() {
return FEATURE_FLAGS.extendedWallpaperEffects();
}
public static boolean lockscreenCustomClocks() {
return FEATURE_FLAGS.lockscreenCustomClocks();
}
public static boolean newCustomizationPickerUi() {
return FEATURE_FLAGS.newCustomizationPickerUi();
}
public static boolean newTouchpadGesturesTutorial() {
return FEATURE_FLAGS.newTouchpadGesturesTutorial();
}
public static boolean returnAnimationFrameworkLibrary() {
return FEATURE_FLAGS.returnAnimationFrameworkLibrary();
}
public static boolean returnAnimationFrameworkLongLived() {
return FEATURE_FLAGS.returnAnimationFrameworkLongLived();
}
public static boolean screenshotContextUrl() {
return FEATURE_FLAGS.screenshotContextUrl();
}
public static boolean shadeAllowBackGesture() {
return FEATURE_FLAGS.shadeAllowBackGesture();
}
public static boolean sidefpsControllerRefactor() {
return FEATURE_FLAGS.sidefpsControllerRefactor();
}
public static boolean smartspaceRemoteviewsIntentHandler() {
return FEATURE_FLAGS.smartspaceRemoteviewsIntentHandler();
}
public static boolean smartspaceSportsCardBackground() {
return FEATURE_FLAGS.smartspaceSportsCardBackground();
}
public static boolean smartspaceUiUpdate() {
return FEATURE_FLAGS.smartspaceUiUpdate();
}
public static boolean smartspaceUiUpdateResources() {
return FEATURE_FLAGS.smartspaceUiUpdateResources();
}
public static boolean statusBarConnectedDisplays() {
return FEATURE_FLAGS.statusBarConnectedDisplays();
}
public static boolean threeButtonCornerSwipe() {
return FEATURE_FLAGS.threeButtonCornerSwipe();
}
public static boolean usePreferredImageEditor() {
return FEATURE_FLAGS.usePreferredImageEditor();
}
private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
}
File diff suppressed because it is too large Load Diff
@@ -3,6 +3,7 @@ package com.android.window.flags2;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/** @hide */
public class FakeFeatureFlagsImpl extends CustomFeatureFlags {
private final Map<String, Boolean> mFlagMap = new HashMap<>();
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,13 +1,13 @@
package com.android.wm.shell;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
/** @hide */
public class CustomFeatureFlags implements FeatureFlags {
@@ -18,216 +18,124 @@ public class CustomFeatureFlags implements FeatureFlags {
}
@Override
public boolean bubbleViewInfoExecutors() {
return getValue(Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS,
FeatureFlags::bubbleViewInfoExecutors);
public boolean animateBubbleSizeChange() {
return getValue(Flags.FLAG_ANIMATE_BUBBLE_SIZE_CHANGE,
FeatureFlags::animateBubbleSizeChange);
}
@Override
public boolean enableAutoTaskStackController() {
return getValue(Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER,
FeatureFlags::enableAutoTaskStackController);
public boolean enableAppPairs() {
return getValue(Flags.FLAG_ENABLE_APP_PAIRS,
FeatureFlags::enableAppPairs);
}
@Override
public boolean enableBubbleAnything() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_ANYTHING,
FeatureFlags::enableBubbleAnything);
FeatureFlags::enableBubbleAnything);
}
@Override
public boolean enableBubbleBar() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_BAR,
FeatureFlags::enableBubbleBar);
FeatureFlags::enableBubbleBar);
}
@Override
public boolean enableBubbleBarOnPhones() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_BAR_ON_PHONES,
FeatureFlags::enableBubbleBarOnPhones);
}
@Override
public boolean enableBubbleStashing() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_STASHING,
FeatureFlags::enableBubbleStashing);
FeatureFlags::enableBubbleStashing);
}
@Override
public boolean enableBubbleTaskViewListener() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER,
FeatureFlags::enableBubbleTaskViewListener);
}
@Override
public boolean enableBubbleToFullscreen() {
return getValue(Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN,
FeatureFlags::enableBubbleToFullscreen);
}
@Override
public boolean enableBubblesLongPressNavHandle() {
return getValue(Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE,
FeatureFlags::enableBubblesLongPressNavHandle);
FeatureFlags::enableBubblesLongPressNavHandle);
}
@Override
public boolean enableCreateAnyBubble() {
return getValue(Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE,
FeatureFlags::enableCreateAnyBubble);
public boolean enableLeftRightSplitInPortrait() {
return getValue(Flags.FLAG_ENABLE_LEFT_RIGHT_SPLIT_IN_PORTRAIT,
FeatureFlags::enableLeftRightSplitInPortrait);
}
@Override
public boolean enableDynamicInsetsForAppLaunch() {
return getValue(Flags.FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH,
FeatureFlags::enableDynamicInsetsForAppLaunch);
}
@Override
public boolean enableFlexibleSplit() {
return getValue(Flags.FLAG_ENABLE_FLEXIBLE_SPLIT,
FeatureFlags::enableFlexibleSplit);
}
@Override
public boolean enableFlexibleTwoAppSplit() {
return getValue(Flags.FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT,
FeatureFlags::enableFlexibleTwoAppSplit);
}
@Override
public boolean enableGsf() {
return getValue(Flags.FLAG_ENABLE_GSF,
FeatureFlags::enableGsf);
}
@Override
public boolean enableMagneticSplitDivider() {
return getValue(Flags.FLAG_ENABLE_MAGNETIC_SPLIT_DIVIDER,
FeatureFlags::enableMagneticSplitDivider);
}
@Override
public boolean enableNewBubbleAnimations() {
return getValue(Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS,
FeatureFlags::enableNewBubbleAnimations);
FeatureFlags::enableNewBubbleAnimations);
}
@Override
public boolean enableOptionalBubbleOverflow() {
return getValue(Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW,
FeatureFlags::enableOptionalBubbleOverflow);
FeatureFlags::enableOptionalBubbleOverflow);
}
@Override
public boolean enablePip2() {
return getValue(Flags.FLAG_ENABLE_PIP2,
FeatureFlags::enablePip2);
public boolean enablePip2Implementation() {
return getValue(Flags.FLAG_ENABLE_PIP2_IMPLEMENTATION,
FeatureFlags::enablePip2Implementation);
}
@Override
public boolean enablePipUmoExperience() {
return getValue(Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE,
FeatureFlags::enablePipUmoExperience);
FeatureFlags::enablePipUmoExperience);
}
@Override
public boolean enableRecentsBookendTransition() {
return getValue(Flags.FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION,
FeatureFlags::enableRecentsBookendTransition);
}
@Override
public boolean enableRetrievableBubbles() {
return getValue(Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES,
FeatureFlags::enableRetrievableBubbles);
FeatureFlags::enableRetrievableBubbles);
}
@Override
public boolean enableShellTopTaskTracking() {
return getValue(Flags.FLAG_ENABLE_SHELL_TOP_TASK_TRACKING,
FeatureFlags::enableShellTopTaskTracking);
public boolean enableSplitContextual() {
return getValue(Flags.FLAG_ENABLE_SPLIT_CONTEXTUAL,
FeatureFlags::enableSplitContextual);
}
@Override
public boolean enableTaskViewControllerCleanup() {
return getValue(Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP,
FeatureFlags::enableTaskViewControllerCleanup);
}
@Override
public boolean enableTaskbarNavbarUnification() {
return getValue(Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION,
FeatureFlags::enableTaskbarNavbarUnification);
FeatureFlags::enableTaskbarNavbarUnification);
}
@Override
public boolean enableTaskbarOnPhones() {
return getValue(Flags.FLAG_ENABLE_TASKBAR_ON_PHONES,
FeatureFlags::enableTaskbarOnPhones);
}
@Override
public boolean enableTinyTaskbar() {
return getValue(Flags.FLAG_ENABLE_TINY_TASKBAR,
FeatureFlags::enableTinyTaskbar);
FeatureFlags::enableTinyTaskbar);
}
@Override
public boolean fixMissingUserChangeCallbacks() {
return getValue(Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS,
FeatureFlags::fixMissingUserChangeCallbacks);
}
@Override
public boolean onlyReuseBubbledTaskWhenLaunchedFromBubble() {
return getValue(Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE,
FeatureFlags::onlyReuseBubbledTaskWhenLaunchedFromBubble);
}
@Override
public boolean taskViewRepository() {
return getValue(Flags.FLAG_TASK_VIEW_REPOSITORY,
FeatureFlags::taskViewRepository);
FeatureFlags::onlyReuseBubbledTaskWhenLaunchedFromBubble);
}
public boolean isFlagReadOnlyOptimized(String flagName) {
if (mReadOnlyFlagsSet.contains(flagName) &&
isOptimizationEnabled()) {
return true;
isOptimizationEnabled()) {
return true;
}
return false;
}
private boolean isOptimizationEnabled() {
return false;
}
@@ -238,70 +146,29 @@ public class CustomFeatureFlags implements FeatureFlags {
public List<String> getFlagNames() {
return Arrays.asList(
Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS,
Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER,
Flags.FLAG_ENABLE_BUBBLE_ANYTHING,
Flags.FLAG_ENABLE_BUBBLE_BAR,
Flags.FLAG_ENABLE_BUBBLE_BAR_ON_PHONES,
Flags.FLAG_ENABLE_BUBBLE_STASHING,
Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER,
Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN,
Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE,
Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE,
Flags.FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH,
Flags.FLAG_ENABLE_FLEXIBLE_SPLIT,
Flags.FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT,
Flags.FLAG_ENABLE_GSF,
Flags.FLAG_ENABLE_MAGNETIC_SPLIT_DIVIDER,
Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS,
Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW,
Flags.FLAG_ENABLE_PIP2,
Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE,
Flags.FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION,
Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES,
Flags.FLAG_ENABLE_SHELL_TOP_TASK_TRACKING,
Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP,
Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION,
Flags.FLAG_ENABLE_TASKBAR_ON_PHONES,
Flags.FLAG_ENABLE_TINY_TASKBAR,
Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS,
Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE,
Flags.FLAG_TASK_VIEW_REPOSITORY
Flags.FLAG_ANIMATE_BUBBLE_SIZE_CHANGE,
Flags.FLAG_ENABLE_APP_PAIRS,
Flags.FLAG_ENABLE_BUBBLE_ANYTHING,
Flags.FLAG_ENABLE_BUBBLE_BAR,
Flags.FLAG_ENABLE_BUBBLE_STASHING,
Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE,
Flags.FLAG_ENABLE_LEFT_RIGHT_SPLIT_IN_PORTRAIT,
Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS,
Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW,
Flags.FLAG_ENABLE_PIP2_IMPLEMENTATION,
Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE,
Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES,
Flags.FLAG_ENABLE_SPLIT_CONTEXTUAL,
Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION,
Flags.FLAG_ENABLE_TINY_TASKBAR,
Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE
);
}
private Set<String> mReadOnlyFlagsSet = new HashSet<>(
Arrays.asList(
Flags.FLAG_BUBBLE_VIEW_INFO_EXECUTORS,
Flags.FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER,
Flags.FLAG_ENABLE_BUBBLE_ANYTHING,
Flags.FLAG_ENABLE_BUBBLE_BAR,
Flags.FLAG_ENABLE_BUBBLE_BAR_ON_PHONES,
Flags.FLAG_ENABLE_BUBBLE_STASHING,
Flags.FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER,
Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN,
Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE,
Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE,
Flags.FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH,
Flags.FLAG_ENABLE_FLEXIBLE_SPLIT,
Flags.FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT,
Flags.FLAG_ENABLE_GSF,
Flags.FLAG_ENABLE_MAGNETIC_SPLIT_DIVIDER,
Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS,
Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW,
Flags.FLAG_ENABLE_PIP2,
Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE,
Flags.FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION,
Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES,
Flags.FLAG_ENABLE_SHELL_TOP_TASK_TRACKING,
Flags.FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP,
Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION,
Flags.FLAG_ENABLE_TASKBAR_ON_PHONES,
Flags.FLAG_ENABLE_TINY_TASKBAR,
Flags.FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS,
Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE,
Flags.FLAG_TASK_VIEW_REPOSITORY,
""
)
Arrays.asList(
Flags.FLAG_ENABLE_PIP2_IMPLEMENTATION,
""
)
);
}
@@ -3,6 +3,7 @@ package com.android.wm.shell;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
/** @hide */
public class FakeFeatureFlagsImpl extends CustomFeatureFlags {
private final Map<String, Boolean> mFlagMap = new HashMap<>();
+35 -105
View File
@@ -1,123 +1,53 @@
package com.android.wm.shell;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public interface FeatureFlags {
boolean bubbleViewInfoExecutors();
boolean enableAutoTaskStackController();
boolean animateBubbleSizeChange();
boolean enableAppPairs();
boolean enableBubbleAnything();
boolean enableBubbleBar();
boolean enableBubbleBarOnPhones();
boolean enableBubbleStashing();
boolean enableBubbleTaskViewListener();
boolean enableBubbleToFullscreen();
boolean enableBubblesLongPressNavHandle();
boolean enableCreateAnyBubble();
boolean enableDynamicInsetsForAppLaunch();
boolean enableFlexibleSplit();
boolean enableFlexibleTwoAppSplit();
boolean enableGsf();
boolean enableMagneticSplitDivider();
boolean enableLeftRightSplitInPortrait();
boolean enableNewBubbleAnimations();
boolean enableOptionalBubbleOverflow();
boolean enablePip2();
boolean enablePip2Implementation();
boolean enablePipUmoExperience();
boolean enableRecentsBookendTransition();
boolean enableRetrievableBubbles();
boolean enableShellTopTaskTracking();
boolean enableTaskViewControllerCleanup();
boolean enableSplitContextual();
boolean enableTaskbarNavbarUnification();
boolean enableTaskbarOnPhones();
boolean enableTinyTaskbar();
boolean fixMissingUserChangeCallbacks();
boolean onlyReuseBubbledTaskWhenLaunchedFromBubble();
boolean taskViewRepository();
}
@@ -1,209 +1,394 @@
package com.android.wm.shell;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import com.android.quickstep.util.DeviceConfigHelper;
import java.nio.file.Files;
import java.nio.file.Paths;
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags {
@Override
private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage"));
private static volatile boolean isCached = false;
private static volatile boolean multitasking_is_cached = false;
private static boolean animateBubbleSizeChange = false;
private static boolean enableAppPairs = true;
private static boolean enableBubbleAnything = false;
private static boolean enableBubbleBar = false;
private static boolean enableBubbleStashing = false;
private static boolean enableBubblesLongPressNavHandle = false;
private static boolean enableLeftRightSplitInPortrait = true;
private static boolean enableNewBubbleAnimations = false;
private static boolean enableOptionalBubbleOverflow = true;
private static boolean enablePipUmoExperience = false;
private static boolean enableRetrievableBubbles = false;
private static boolean enableSplitContextual = true;
private static boolean enableTaskbarNavbarUnification = true;
private static boolean enableTinyTaskbar = false;
private static boolean onlyReuseBubbledTaskWhenLaunchedFromBubble = false;
public boolean bubbleViewInfoExecutors() {
return true;
private void init() {
boolean foundPackage = true;
animateBubbleSizeChange = foundPackage;
enableAppPairs = foundPackage;
enableBubbleAnything = foundPackage;
enableBubbleBar = foundPackage;
enableBubbleStashing = foundPackage;
enableBubblesLongPressNavHandle = foundPackage ;
enableLeftRightSplitInPortrait = foundPackage;
enableNewBubbleAnimations = foundPackage;
enableOptionalBubbleOverflow = foundPackage;
enablePipUmoExperience = foundPackage;
enableRetrievableBubbles = foundPackage;
enableSplitContextual = foundPackage;
enableTaskbarNavbarUnification = foundPackage;
enableTinyTaskbar = foundPackage;
onlyReuseBubbledTaskWhenLaunchedFromBubble = foundPackage ;
isCached = true;
}
private void load_overrides_multitasking() {
try {
var properties = DeviceConfigHelper.Companion.getPrefs();
animateBubbleSizeChange =
properties.getBoolean(Flags.FLAG_ANIMATE_BUBBLE_SIZE_CHANGE, false);
enableAppPairs =
properties.getBoolean(Flags.FLAG_ENABLE_APP_PAIRS, true);
enableBubbleAnything =
properties.getBoolean(Flags.FLAG_ENABLE_BUBBLE_ANYTHING, false);
enableBubbleBar =
properties.getBoolean(Flags.FLAG_ENABLE_BUBBLE_BAR, false);
enableBubbleStashing =
properties.getBoolean(Flags.FLAG_ENABLE_BUBBLE_STASHING, false);
enableBubblesLongPressNavHandle =
properties.getBoolean(Flags.FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE, false);
enableLeftRightSplitInPortrait =
properties.getBoolean(Flags.FLAG_ENABLE_LEFT_RIGHT_SPLIT_IN_PORTRAIT, true);
enableNewBubbleAnimations =
properties.getBoolean(Flags.FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS, false);
enableOptionalBubbleOverflow =
properties.getBoolean(Flags.FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW, true);
enablePipUmoExperience =
properties.getBoolean(Flags.FLAG_ENABLE_PIP_UMO_EXPERIENCE, false);
enableRetrievableBubbles =
properties.getBoolean(Flags.FLAG_ENABLE_RETRIEVABLE_BUBBLES, false);
enableSplitContextual =
properties.getBoolean(Flags.FLAG_ENABLE_SPLIT_CONTEXTUAL, true);
enableTaskbarNavbarUnification =
properties.getBoolean(Flags.FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION, true);
enableTinyTaskbar =
properties.getBoolean(Flags.FLAG_ENABLE_TINY_TASKBAR, false);
onlyReuseBubbledTaskWhenLaunchedFromBubble =
properties.getBoolean(Flags.FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE, false);
} catch (NullPointerException e) {
throw new RuntimeException(
"Cannot read value from namespace multitasking "
+ "from DeviceConfig. It could be that the code using flag "
+ "executed before SettingsProvider initialization. Please use "
+ "fixed read-only flag by adding is_fixed_read_only: true in "
+ "flag declaration.",
e
);
}
multitasking_is_cached = true;
}
@Override
public boolean animateBubbleSizeChange() {
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return animateBubbleSizeChange;
public boolean enableAutoTaskStackController() {
return false;
}
@Override
public boolean enableAppPairs() {
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableAppPairs;
}
@Override
public boolean enableBubbleAnything() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableBubbleAnything;
}
@Override
public boolean enableBubbleBar() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableBubbleBar;
}
@Override
public boolean enableBubbleBarOnPhones() {
return false;
}
@Override
public boolean enableBubbleStashing() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableBubbleStashing;
}
@Override
public boolean enableBubbleTaskViewListener() {
return false;
}
@Override
public boolean enableBubbleToFullscreen() {
return false;
}
@Override
public boolean enableBubblesLongPressNavHandle() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableBubblesLongPressNavHandle;
}
@Override
public boolean enableLeftRightSplitInPortrait() {
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableLeftRightSplitInPortrait;
public boolean enableCreateAnyBubble() {
return false;
}
@Override
public boolean enableDynamicInsetsForAppLaunch() {
return false;
}
@Override
public boolean enableFlexibleSplit() {
return false;
}
@Override
public boolean enableFlexibleTwoAppSplit() {
return false;
}
@Override
public boolean enableGsf() {
return true;
}
@Override
public boolean enableMagneticSplitDivider() {
return false;
}
@Override
public boolean enableNewBubbleAnimations() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableNewBubbleAnimations;
}
@Override
public boolean enableOptionalBubbleOverflow() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableOptionalBubbleOverflow;
}
@Override
public boolean enablePip2() {
public boolean enablePip2Implementation() {
return false;
}
@Override
public boolean enablePipUmoExperience() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enablePipUmoExperience;
}
@Override
public boolean enableRecentsBookendTransition() {
return false;
}
@Override
public boolean enableRetrievableBubbles() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableRetrievableBubbles;
}
@Override
public boolean enableSplitContextual() {
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableSplitContextual;
public boolean enableShellTopTaskTracking() {
return false;
}
@Override
public boolean enableTaskViewControllerCleanup() {
return true;
}
@Override
public boolean enableTaskbarNavbarUnification() {
return true;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableTaskbarNavbarUnification;
}
@Override
public boolean enableTaskbarOnPhones() {
return true;
}
@Override
public boolean enableTinyTaskbar() {
return false;
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return enableTinyTaskbar;
}
@Override
public boolean fixMissingUserChangeCallbacks() {
return false;
}
@Override
public boolean onlyReuseBubbledTaskWhenLaunchedFromBubble() {
return true;
}
if (isReadFromNew) {
if (!isCached) {
init();
}
} else {
if (!multitasking_is_cached) {
load_overrides_multitasking();
}
}
return onlyReuseBubbledTaskWhenLaunchedFromBubble;
@Override
public boolean taskViewRepository() {
return false;
}
}
+46 -198
View File
@@ -1,271 +1,119 @@
package com.android.wm.shell;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
/** @hide */
public final class Flags {
/** @hide */
public static final String FLAG_BUBBLE_VIEW_INFO_EXECUTORS = "com.android.wm.shell.bubble_view_info_executors";
public static final String FLAG_ANIMATE_BUBBLE_SIZE_CHANGE = "com.android.wm.shell.animate_bubble_size_change";
/** @hide */
public static final String FLAG_ENABLE_AUTO_TASK_STACK_CONTROLLER = "com.android.wm.shell.enable_auto_task_stack_controller";
public static final String FLAG_ENABLE_APP_PAIRS = "com.android.wm.shell.enable_app_pairs";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_ANYTHING = "com.android.wm.shell.enable_bubble_anything";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_BAR = "com.android.wm.shell.enable_bubble_bar";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_BAR_ON_PHONES = "com.android.wm.shell.enable_bubble_bar_on_phones";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_STASHING = "com.android.wm.shell.enable_bubble_stashing";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_TASK_VIEW_LISTENER = "com.android.wm.shell.enable_bubble_task_view_listener";
/** @hide */
public static final String FLAG_ENABLE_BUBBLE_TO_FULLSCREEN = "com.android.wm.shell.enable_bubble_to_fullscreen";
/** @hide */
public static final String FLAG_ENABLE_BUBBLES_LONG_PRESS_NAV_HANDLE = "com.android.wm.shell.enable_bubbles_long_press_nav_handle";
/** @hide */
public static final String FLAG_ENABLE_CREATE_ANY_BUBBLE = "com.android.wm.shell.enable_create_any_bubble";
/** @hide */
public static final String FLAG_ENABLE_DYNAMIC_INSETS_FOR_APP_LAUNCH = "com.android.wm.shell.enable_dynamic_insets_for_app_launch";
/** @hide */
public static final String FLAG_ENABLE_FLEXIBLE_SPLIT = "com.android.wm.shell.enable_flexible_split";
/** @hide */
public static final String FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT = "com.android.wm.shell.enable_flexible_two_app_split";
/** @hide */
public static final String FLAG_ENABLE_GSF = "com.android.wm.shell.enable_gsf";
/** @hide */
public static final String FLAG_ENABLE_MAGNETIC_SPLIT_DIVIDER = "com.android.wm.shell.enable_magnetic_split_divider";
public static final String FLAG_ENABLE_LEFT_RIGHT_SPLIT_IN_PORTRAIT = "com.android.wm.shell.enable_left_right_split_in_portrait";
/** @hide */
public static final String FLAG_ENABLE_NEW_BUBBLE_ANIMATIONS = "com.android.wm.shell.enable_new_bubble_animations";
/** @hide */
public static final String FLAG_ENABLE_OPTIONAL_BUBBLE_OVERFLOW = "com.android.wm.shell.enable_optional_bubble_overflow";
/** @hide */
public static final String FLAG_ENABLE_PIP2 = "com.android.wm.shell.enable_pip2";
public static final String FLAG_ENABLE_PIP2_IMPLEMENTATION = "com.android.wm.shell.enable_pip2_implementation";
/** @hide */
public static final String FLAG_ENABLE_PIP_UMO_EXPERIENCE = "com.android.wm.shell.enable_pip_umo_experience";
/** @hide */
public static final String FLAG_ENABLE_RECENTS_BOOKEND_TRANSITION = "com.android.wm.shell.enable_recents_bookend_transition";
/** @hide */
public static final String FLAG_ENABLE_RETRIEVABLE_BUBBLES = "com.android.wm.shell.enable_retrievable_bubbles";
/** @hide */
public static final String FLAG_ENABLE_SHELL_TOP_TASK_TRACKING = "com.android.wm.shell.enable_shell_top_task_tracking";
/** @hide */
public static final String FLAG_ENABLE_TASK_VIEW_CONTROLLER_CLEANUP = "com.android.wm.shell.enable_task_view_controller_cleanup";
public static final String FLAG_ENABLE_SPLIT_CONTEXTUAL = "com.android.wm.shell.enable_split_contextual";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_NAVBAR_UNIFICATION = "com.android.wm.shell.enable_taskbar_navbar_unification";
/** @hide */
public static final String FLAG_ENABLE_TASKBAR_ON_PHONES = "com.android.wm.shell.enable_taskbar_on_phones";
/** @hide */
public static final String FLAG_ENABLE_TINY_TASKBAR = "com.android.wm.shell.enable_tiny_taskbar";
/** @hide */
public static final String FLAG_FIX_MISSING_USER_CHANGE_CALLBACKS = "com.android.wm.shell.fix_missing_user_change_callbacks";
/** @hide */
public static final String FLAG_ONLY_REUSE_BUBBLED_TASK_WHEN_LAUNCHED_FROM_BUBBLE = "com.android.wm.shell.only_reuse_bubbled_task_when_launched_from_bubble";
/** @hide */
public static final String FLAG_TASK_VIEW_REPOSITORY = "com.android.wm.shell.task_view_repository";
public static boolean bubbleViewInfoExecutors() {
return FEATURE_FLAGS.bubbleViewInfoExecutors();
public static boolean animateBubbleSizeChange() {
return FEATURE_FLAGS.animateBubbleSizeChange();
}
public static boolean enableAutoTaskStackController() {
return FEATURE_FLAGS.enableAutoTaskStackController();
public static boolean enableAppPairs() {
return FEATURE_FLAGS.enableAppPairs();
}
public static boolean enableBubbleAnything() {
return FEATURE_FLAGS.enableBubbleAnything();
}
public static boolean enableBubbleBar() {
return FEATURE_FLAGS.enableBubbleBar();
}
public static boolean enableBubbleBarOnPhones() {
return FEATURE_FLAGS.enableBubbleBarOnPhones();
}
public static boolean enableBubbleStashing() {
return FEATURE_FLAGS.enableBubbleStashing();
}
public static boolean enableBubbleTaskViewListener() {
return FEATURE_FLAGS.enableBubbleTaskViewListener();
}
public static boolean enableBubbleToFullscreen() {
return FEATURE_FLAGS.enableBubbleToFullscreen();
}
public static boolean enableBubblesLongPressNavHandle() {
return FEATURE_FLAGS.enableBubblesLongPressNavHandle();
}
public static boolean enableCreateAnyBubble() {
return FEATURE_FLAGS.enableCreateAnyBubble();
public static boolean enableLeftRightSplitInPortrait() {
return FEATURE_FLAGS.enableLeftRightSplitInPortrait();
}
public static boolean enableDynamicInsetsForAppLaunch() {
return FEATURE_FLAGS.enableDynamicInsetsForAppLaunch();
}
public static boolean enableFlexibleSplit() {
return FEATURE_FLAGS.enableFlexibleSplit();
}
public static boolean enableFlexibleTwoAppSplit() {
return FEATURE_FLAGS.enableFlexibleTwoAppSplit();
}
public static boolean enableGsf() {
return FEATURE_FLAGS.enableGsf();
}
public static boolean enableMagneticSplitDivider() {
return FEATURE_FLAGS.enableMagneticSplitDivider();
}
public static boolean enableNewBubbleAnimations() {
return FEATURE_FLAGS.enableNewBubbleAnimations();
}
public static boolean enableOptionalBubbleOverflow() {
return FEATURE_FLAGS.enableOptionalBubbleOverflow();
}
public static boolean enablePip2() {
return FEATURE_FLAGS.enablePip2();
public static boolean enablePip2Implementation() {
return FEATURE_FLAGS.enablePip2Implementation();
}
public static boolean enablePipUmoExperience() {
return FEATURE_FLAGS.enablePipUmoExperience();
}
public static boolean enableRecentsBookendTransition() {
return FEATURE_FLAGS.enableRecentsBookendTransition();
}
public static boolean enableRetrievableBubbles() {
return FEATURE_FLAGS.enableRetrievableBubbles();
}
public static boolean enableShellTopTaskTracking() {
return FEATURE_FLAGS.enableShellTopTaskTracking();
public static boolean enableSplitContextual() {
return FEATURE_FLAGS.enableSplitContextual();
}
public static boolean enableTaskViewControllerCleanup() {
return FEATURE_FLAGS.enableTaskViewControllerCleanup();
}
public static boolean enableTaskbarNavbarUnification() {
return FEATURE_FLAGS.enableTaskbarNavbarUnification();
}
public static boolean enableTaskbarOnPhones() {
return FEATURE_FLAGS.enableTaskbarOnPhones();
}
public static boolean enableTinyTaskbar() {
return FEATURE_FLAGS.enableTinyTaskbar();
}
public static boolean fixMissingUserChangeCallbacks() {
return FEATURE_FLAGS.fixMissingUserChangeCallbacks();
}
public static boolean onlyReuseBubbledTaskWhenLaunchedFromBubble() {
return FEATURE_FLAGS.onlyReuseBubbledTaskWhenLaunchedFromBubble();
}
public static boolean taskViewRepository() {
return FEATURE_FLAGS.taskViewRepository();
}
private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
}
-1
View File
@@ -56,7 +56,6 @@
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
+3 -3
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_share_drop_target_label" msgid="5804774105974539508">"Deel app"</string>
<string name="app_share_drop_target_label" msgid="5804774105974539508">"Deel program"</string>
<string name="action_listen" msgid="2370304050784689486">"Luister"</string>
<string name="action_translate" msgid="8028378961867277746">"Vertaal"</string>
<string name="action_search" msgid="6269564710943755464">"Lens"</string>
@@ -9,12 +9,12 @@
<string name="dialog_cancel" msgid="6464336969134856366">"KANSELLEER"</string>
<string name="dialog_settings" msgid="6564397136021186148">"INSTELLINGS"</string>
<string name="niu_actions_confirmation_title" msgid="3863451714863526143">"Vertaal of luister na teks op skerm"</string>
<string name="niu_actions_confirmation_text" msgid="2105271481950866089">"Inligting soos teks op jou skerm, webadresse en skermskote kan met Google gedeel word.\n\nGaan na "<b>"Instellings &gt; Apps &gt; Verstekapps &gt; Digitale Assistent-app"</b>" om te verander watter inligting jy deel."</string>
<string name="niu_actions_confirmation_text" msgid="2105271481950866089">"Inligting soos teks op jou skerm, webadresse en skermskote kan met Google gedeel word.\n\nGaan na "<b>"Instellings &gt; Programme &gt; Verstekprogramme &gt; Digitale Assistent-program"</b>" om te verander watter inligting jy deel."</string>
<string name="assistant_not_selected_title" msgid="5017072974603345228">"Kies \'n assistent om hierdie kenmerk te gebruik"</string>
<string name="assistant_not_selected_text" msgid="3244613673884359276">"Kies \'n digitalebystandprogram in Instellings om na teks op jou skerm te luister of dit te vertaal"</string>
<string name="assistant_not_supported_title" msgid="1675788067597484142">"Verander jou assistent om hierdie kenmerk te gebruik"</string>
<string name="assistant_not_supported_text" msgid="1708031078549268884">"Verander jou digitalebystandprogram in Instellings om na teks op jou skerm te luister of dit te vertaal"</string>
<string name="tooltip_listen" msgid="7634466447860989102">"Tik hier om na teks op hierdie skerm te luister"</string>
<string name="tooltip_translate" msgid="4184845868901542567">"Tik hier om teks op hierdie skerm te vertaal"</string>
<string name="toast_p2p_app_not_shareable" msgid="7229739094132131536">"Hierdie app kan nie gedeel word nie"</string>
<string name="toast_p2p_app_not_shareable" msgid="7229739094132131536">"Hierdie program kan nie gedeel word nie"</string>
</resources>
+1 -1
View File
@@ -4,7 +4,7 @@
<string name="app_share_drop_target_label" msgid="5804774105974539508">"Абагуліць праграму"</string>
<string name="action_listen" msgid="2370304050784689486">"Праслухаць"</string>
<string name="action_translate" msgid="8028378961867277746">"Перакласці"</string>
<string name="action_search" msgid="6269564710943755464">"Абектыў"</string>
<string name="action_search" msgid="6269564710943755464">"Аб\'ектыў"</string>
<string name="dialog_acknowledge" msgid="2804025517675853172">"ЗРАЗУМЕЛА"</string>
<string name="dialog_cancel" msgid="6464336969134856366">"СКАСАВАЦЬ"</string>
<string name="dialog_settings" msgid="6564397136021186148">"НАЛАДЫ"</string>
+1 -1
View File
@@ -5,7 +5,7 @@
<string name="action_listen" msgid="2370304050784689486">"گوش دادن"</string>
<string name="action_translate" msgid="8028378961867277746">"ترجمه"</string>
<string name="action_search" msgid="6269564710943755464">"لنز"</string>
<string name="dialog_acknowledge" msgid="2804025517675853172">"متوجهم"</string>
<string name="dialog_acknowledge" msgid="2804025517675853172">"متوجهام"</string>
<string name="dialog_cancel" msgid="6464336969134856366">"لغو"</string>
<string name="dialog_settings" msgid="6564397136021186148">"تنظیمات"</string>
<string name="niu_actions_confirmation_title" msgid="3863451714863526143">"ترجمه نوشتار روی صفحه‌نمایش یا گوش دادن به آن"</string>
+2 -2
View File
@@ -14,7 +14,7 @@
<string name="assistant_not_selected_text" msgid="3244613673884359276">"כדי להאזין לטקסט שבמסך או לתרגם אותו, צריך לבחור אפליקציית עוזר דיגיטלי ב\'הגדרות\'"</string>
<string name="assistant_not_supported_title" msgid="1675788067597484142">"צריך לשנות את העוזר הדיגיטלי כדי להשתמש בתכונה הזו"</string>
<string name="assistant_not_supported_text" msgid="1708031078549268884">"כדי להאזין לטקסט שבמסך או לתרגם אותו, צריך לשנות את אפליקציית העוזר הדיגיטלי ב\'הגדרות\'"</string>
<string name="tooltip_listen" msgid="7634466447860989102">"צריך ללחוץ כאן כדי להאזין לטקסט שבמסך הזה"</string>
<string name="tooltip_translate" msgid="4184845868901542567">"צריך ללחוץ כאן כדי לתרגם את הטקסט שבמסך הזה"</string>
<string name="tooltip_listen" msgid="7634466447860989102">"צריך להקיש כאן כדי להאזין לטקסט שבמסך הזה"</string>
<string name="tooltip_translate" msgid="4184845868901542567">"צריך להקיש כאן כדי לתרגם את הטקסט שבמסך הזה"</string>
<string name="toast_p2p_app_not_shareable" msgid="7229739094132131536">"אי אפשר לשתף את האפליקציה הזו"</string>
</resources>
+3 -3
View File
@@ -9,11 +9,11 @@
<string name="dialog_cancel" msgid="6464336969134856366">"रद्द गर्नुहोस्"</string>
<string name="dialog_settings" msgid="6564397136021186148">"सेटिङ"</string>
<string name="niu_actions_confirmation_title" msgid="3863451714863526143">"स्क्रिनमा देखिने पाठ अनुवाद गर्नुहोस् वा पढेर सुनाउनुहोस्"</string>
<string name="niu_actions_confirmation_text" msgid="2105271481950866089">"तपाईंको स्क्रिनमा देखिने पाठ, वेब ठेगाना र स्क्रिनसटलगायतका जानकारी Google सँग सेयर गर्न सकिन्छ।\n\nकुन कुन जानकारी सेयर गर्न दिने भन्ने सेटिङ बदल्न "<b>"सेटिङ &gt; एप &gt; डिफल्ट एप &gt; डिजिटल एसिस्टेन्ट एप"</b>" मा जानुहोस्।"</string>
<string name="niu_actions_confirmation_text" msgid="2105271481950866089">"तपाईंको स्क्रिनमा देखिने पाठ, वेब ठेगाना र स्क्रिनसटलगायतका जानकारी Google सँग सेयर गर्न सकिन्छ।\n\nकुन कुन जानकारी सेयर गर्न दिने भन्ने सेटिङ बदल्न "<b>"सेटिङ &gt; एप &gt; डिफल्ट एप &gt; डिजिटल सहायक एप"</b>" मा जानुहोस्।"</string>
<string name="assistant_not_selected_title" msgid="5017072974603345228">"तपाईं यो सुविधा चलाउन चाहनुहुन्छ भने कुनै सहायक छनौट गर्नुहोस्"</string>
<string name="assistant_not_selected_text" msgid="3244613673884359276">"तपाईं आफ्नो स्क्रिनमा देखिने पाठ सुन्न वा अनुवाद गर्न चाहनुहुन्छ भने सेटिङमा गई कुनै डिजिटल एसिस्टेन्ट एप छनौट गर्नुहोस्"</string>
<string name="assistant_not_selected_text" msgid="3244613673884359276">"तपाईं आफ्नो स्क्रिनमा देखिने पाठ सुन्न वा अनुवाद गर्न चाहनुहुन्छ भने सेटिङमा गई कुनै डिजिटल सहायक एप छनौट गर्नुहोस्"</string>
<string name="assistant_not_supported_title" msgid="1675788067597484142">"तपाईं यो सुविधा चलाउन चाहनुहुन्छ भने आफ्नो सहायक परिवर्तन गर्नुहोस्"</string>
<string name="assistant_not_supported_text" msgid="1708031078549268884">"तपाईं आफ्नो स्क्रिनमा देखिने पाठ सुन्न वा अनुवाद गर्न चाहनुहुन्छ भने सेटिङमा गई कुनै डिजिटल एसिस्टेन्ट एप परिर्वर्तन गर्नुहोस्"</string>
<string name="assistant_not_supported_text" msgid="1708031078549268884">"तपाईं आफ्नो स्क्रिनमा देखिने पाठ सुन्न वा अनुवाद गर्न चाहनुहुन्छ भने सेटिङमा गई कुनै डिजिटल सहायक एप परिर्वर्तन गर्नुहोस्"</string>
<string name="tooltip_listen" msgid="7634466447860989102">"तपाईं यो स्क्रिनमा देखिने पाठ सुन्न चाहनुहुन्छ यहाँ ट्याप गर्नुहोस्"</string>
<string name="tooltip_translate" msgid="4184845868901542567">"तपाईं यो स्क्रिनमा देखिने पाठ अनुवाद गर्न चाहनुहुन्छ यहाँ ट्याप गर्नुहोस्"</string>
<string name="toast_p2p_app_not_shareable" msgid="7229739094132131536">"यो एप अरूलाई चलाउन दिन मिल्दैन"</string>
+1 -1
View File
@@ -16,7 +16,7 @@
-->
<resources>
<!-- App themes -->
<style name="LauncherTheme" parent="@style/DynamicColorsBaseLauncherTheme">
<style name="LauncherTheme" parent="@style/BaseLauncherTheme">
<item name="overviewButtonTextColor">@color/go_overview_text_color</item>
<item name="overviewButtonIconColor">@color/go_overview_text_color</item>
<item name="overviewButtonBackgroundColor">@color/go_overview_button_color</item>
@@ -37,13 +37,12 @@ import android.widget.Toast;
import androidx.core.content.FileProvider;
import com.android.internal.annotations.VisibleForTesting;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.AppShareabilityChecker;
import com.android.launcher3.model.AppShareabilityJobService;
import com.android.launcher3.model.AppShareabilityManager;
import com.android.launcher3.model.AppShareabilityManager.ShareabilityStatus;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.popup.PopupDataProvider;
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.views.ActivityContext;
@@ -115,17 +114,17 @@ public final class AppSharing {
* The Share App system shortcut, used to initiate p2p sharing of a given app
*/
public final class Share extends SystemShortcut<Launcher> {
private final PopupDataProvider mPopupDataProvider;
private final boolean mSharingEnabledForUser;
private final Set<View> mBoundViews = Collections.newSetFromMap(new WeakHashMap<>());
private boolean mIsEnabled = true;
private StatsLogManager mStatsLogManager;
public Share(Launcher target, ItemInfo itemInfo, View originalView) {
super(R.drawable.ic_share, R.string.app_share_drop_target_label, target, itemInfo,
originalView);
mStatsLogManager = ActivityContext.lookupContext(originalView.getContext())
.getStatsLogManager();
mPopupDataProvider = target.getPopupDataProvider();
mSharingEnabledForUser = bluetoothSharingEnabled(target);
if (!mSharingEnabledForUser) {
setEnabled(false);
@@ -151,7 +150,8 @@ public final class AppSharing {
@Override
public void onClick(View view) {
mStatsLogManager.logger().log(LAUNCHER_SYSTEM_SHORTCUT_APP_SHARE_TAP);
ActivityContext.lookupContext(view.getContext())
.getStatsLogManager().logger().log(LAUNCHER_SYSTEM_SHORTCUT_APP_SHARE_TAP);
if (!mIsEnabled) {
showCannotShareToast(view.getContext());
return;
@@ -240,11 +240,6 @@ public final class AppSharing {
public boolean isEnabled() {
return mIsEnabled;
}
@VisibleForTesting
void setStatsLogManager(StatsLogManager statsLogManager) {
mStatsLogManager = statsLogManager;
}
}
/**
@@ -31,7 +31,6 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.drawable.ColorDrawable;
@@ -48,7 +47,6 @@ import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.BaseActivity;
@@ -58,8 +56,9 @@ import com.android.launcher3.views.ArrowTipView;
import com.android.quickstep.util.AssistContentRequester;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.quickstep.views.GoOverviewActionsView;
import com.android.quickstep.views.TaskContainer;
import com.android.quickstep.views.TaskView.TaskContainer;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import java.lang.annotation.Retention;
@@ -132,7 +131,7 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
* Called when the current task is interactive for the user
*/
@Override
public void initOverlay(Task task, @Nullable Bitmap thumbnail, Matrix matrix,
public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix,
boolean rotated) {
if (mDialog != null && mDialog.isShowing()) {
// Redraw the dialog in case the layout changed
@@ -149,7 +148,8 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
// Disable Overview Actions for Work Profile apps
boolean isManagedProfileTask =
UserManager.get(mApplicationContext).isManagedProfile(task.key.userId);
boolean isAllowedByPolicy = isRealSnapshot() && !isManagedProfileTask;
boolean isAllowedByPolicy = mTaskContainer.getThumbnailViewDeprecated().isRealSnapshot()
&& !isManagedProfileTask;
getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
mTaskPackageName = task.key.getPackageName();
mSharedPreferences = LauncherPrefs.getPrefs(mApplicationContext);
+5 -7
View File
@@ -1,18 +1,16 @@
# Disable buildFeatures flags by default
android.defaults.buildfeatures.resvalues=false
android.defaults.buildfeatures.shaders=false
android.useAndroidX=true
android.enableHiddenApiCheck=false
android.hideApiWarning=false
# Improve build performance by enabling R8 parallelism.
android.r8.maxWorkers=4
kotlin.code.style=official
org.gradle.caching=true
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8 -XX:+UseParallelGC
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC
org.gradle.parallel=true
org.gradle.configuration-cache=true
org.gradle.configuration-cache.parallel=true
android.experimental.enableParallelR8=true
# Enable these together or else Gradle would panic and fail
android.builtInKotlin=false
android.newDsl=false
+7 -14
View File
@@ -1,7 +1,7 @@
[versions]
jdkRelease = "21"
jdkRelease = "17"
agp = "9.0.0-beta05"
agp = "8.13.2"
kotlin = "2.3.0"
androidx-room = "2.8.4"
androidx-lifecycle = "2.10.0"
@@ -40,9 +40,6 @@ androidx-core-ktx = "androidx.core:core-ktx:1.17.0"
androidx-datastore-preferences = "androidx.datastore:datastore-preferences:1.2.0"
androidx-dynamicanimation = "androidx.dynamicanimation:dynamicanimation:1.1.0"
androidx-espresso-core = "androidx.test.espresso:espresso-core:3.7.0"
androidx-graphics-core = "androidx.graphics:graphics-core:1.0.4" # Added from Current
androidx-graphics-path = "androidx.graphics:graphics-path:1.0.1" # Added from Current
androidx-graphics-shapes = "androidx.graphics:graphics-shapes:1.1.0" # Added from Current
androidx-junit = "androidx.test.ext:junit:1.3.0"
androidx-lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref = "androidx-lifecycle" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
@@ -59,18 +56,18 @@ androidx-window = "androidx.window:window:1.5.1"
compose-bom = "androidx.compose:compose-bom:2025.12.01"
compose-foundation = { module = "androidx.compose.foundation:foundation" }
compose-material-icons = "androidx.compose.material:material-icons-extended:1.7.8"
compose-material3 = "androidx.compose.material3:material3:1.5.0-alpha10"
compose-material3 = { module = "androidx.compose.material3:material3" }
compose-material3-windowSizeClass = { module = "androidx.compose.material3:material3-window-size-class" }
compose-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata" }
compose-ui = { module = "androidx.compose.ui:ui" }
compose-ui-google-fonts = { module = "androidx.compose.ui:ui-text-google-fonts" }
compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
compose-ui-util = { module = "androidx.compose.ui:ui-util" }
# Dagger & Hilt
dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", version.ref = "dagger" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "dagger" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "dagger" }
# Accompanist
accompanist-adaptive = { group = "com.google.accompanist", name = "accompanist-adaptive", version.ref = "accompanist" }
@@ -95,7 +92,6 @@ room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "
# Kotlin
kotlin-androidExtensionRuntime = { module = "org.jetbrains.kotlin:kotlin-android-extensions-runtime", version.ref = "kotlin" }
kotlin-parcelizeRuntime = { module = "org.jetbrains.kotlin:kotlin-parcelize-runtime", version.ref = "kotlin" }
kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" }
# KotlinX
kotlinx-coroutines-android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
kotlinx-serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0"
@@ -110,14 +106,12 @@ chickenhook-restrictionbypass = "com.github.ChickenHook:RestrictionBypass:2.2"
coil-compose = "io.coil-kt:coil-compose:2.7.0"
google-material = "com.google.android.material:material:1.13.0"
hoko-blur = "io.github.hokofly:hoko-blur:1.5.5"
javax-inject = "javax.inject:javax.inject:1"
kdrag0n-colorkt = "dev.kdrag0n:colorkt:1.0.5"
leakcanary-android = "com.squareup.leakcanary:leakcanary-android:2.14"
libsu-core = { group = "com.github.topjohnwu.libsu", name = "core", version.ref = "libsu" }
libsu-service = { group = "com.github.topjohnwu.libsu", name = "service", version.ref = "libsu" }
material-motion-compose = "io.github.fornewid:material-motion-compose-core:2.0.1"
material-motion-compose = "io.github.fornewid:material-motion-compose-core:1.2.1"
persian-date = "com.github.samanzamani:PersianDate:1.7.1"
reorderable = "sh.calvin.reorderable:reorderable:3.0.0"
reorderable = "sh.calvin.reorderable:reorderable:2.5.1"
rikka-annotation = { module = "dev.rikka.tools.refine:annotation", version.ref = "refine" }
rikka-annotation-processor = { module = "dev.rikka.tools.refine:annotation-processor", version.ref = "refine" }
rikka-refine-runtime = { group = "dev.rikka.tools.refine", name = "runtime", version.ref = "refine" }
@@ -128,7 +122,6 @@ composeRules = "io.nlopez.compose.rules:ktlint:0.5.3"
[bundles]
accompanist = ["accompanist-adaptive", "accompanist-drawablepainter", "accompanist-permissions"]
graphics = ["androidx-graphics-core", "androidx-graphics-path", "androidx-graphics-shapes"]
opto = ["opto-domain", "opto-core", "opto-compose"]
retrofit = ["retrofit-core", "retrofit-converter-kotlinx", "okhttp"]
room = ["room-runtime", "room-ktx"]
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -18,5 +18,5 @@
*/
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#000000" android:alpha="0.32" />
<item android:color="@color/system_neutral1_200" android:alpha="0.8" />
</selector>
+12 -6
View File
@@ -1,10 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M480,680Q497,680 508.5,668.5Q520,657 520,640L520,480Q520,463 508.5,451.5Q497,440 480,440Q463,440 451.5,451.5Q440,463 440,480L440,640Q440,657 451.5,668.5Q463,680 480,680ZM480,360Q497,360 508.5,348.5Q520,337 520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320Q440,337 451.5,348.5Q463,360 480,360ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880Z"/>
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:pathData="M12,22C17.5228,22 22,17.5228 22,12C22,6.4771 17.5228,2 12,2C6.4771,2 2,6.4771 2,12C2,17.5228 6.4771,22 12,22ZM12,20C16.4183,20 20,16.4183 20,12C20,7.5817 16.4183,4 12,4C7.5817,4 4,7.5817 4,12C4,16.4183 7.5817,20 12,20Z" />
<path
android:fillColor="#ffffff"
android:pathData="M12,8m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" />
<path
android:fillColor="#ffffff"
android:pathData="M12,11L12,11A1,1 0,0 1,13 12L13,16A1,1 0,0 1,12 17L12,17A1,1 0,0 1,11 16L11,12A1,1 0,0 1,12 11z" />
</vector>
+12 -4
View File
@@ -1,5 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M313,520L509,716Q521,728 520.5,744Q520,760 508,772Q496,783 480,783.5Q464,784 452,772L188,508Q182,502 179.5,495Q177,488 177,480Q177,472 179.5,465Q182,458 188,452L452,188Q463,177 479.5,177Q496,177 508,188Q520,200 520,216.5Q520,233 508,245L313,440L760,440Q777,440 788.5,451.5Q800,463 800,480Q800,497 788.5,508.5Q777,520 760,520L313,520Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:name="vector"
android:width="24dp"
android:height="24dp"
android:tint="?android:attr/textColorPrimary"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:name="path"
android:fillColor="#000"
android:pathData="M 20 11 L 7.83 11 L 13.42 5.41 L 12 4 L 4 12 L 12 20 L 13.41 18.59 L 7.83 13 L 20 13 L 20 11 Z"
android:strokeWidth="1" />
</vector>
+25 -4
View File
@@ -1,5 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M480,840Q415,840 359.5,808Q304,776 272,720L200,720Q183,720 171.5,708.5Q160,697 160,680Q160,663 171.5,651.5Q183,640 200,640L244,640Q241,620 240.5,600Q240,580 240,560L200,560Q183,560 171.5,548.5Q160,537 160,520Q160,503 171.5,491.5Q183,480 200,480L240,480Q240,460 240.5,440Q241,420 244,400L200,400Q183,400 171.5,388.5Q160,377 160,360Q160,343 171.5,331.5Q183,320 200,320L272,320Q286,297 303.5,277Q321,257 344,242L307,204Q296,193 296,176.5Q296,160 308,148Q319,137 336,137Q353,137 364,148L422,206Q450,197 479,197Q508,197 536,206L596,147Q607,136 623.5,136Q640,136 652,148Q663,159 663,176Q663,193 652,204L614,242Q637,257 655.5,276.5Q674,296 688,320L760,320Q777,320 788.5,331.5Q800,343 800,360Q800,377 788.5,388.5Q777,400 760,400L716,400Q719,420 719.5,440Q720,460 720,480L760,480Q777,480 788.5,491.5Q800,503 800,520Q800,537 788.5,548.5Q777,560 760,560L720,560Q720,580 719.5,600Q719,620 716,640L760,640Q777,640 788.5,651.5Q800,663 800,680Q800,697 788.5,708.5Q777,720 760,720L688,720Q656,776 600.5,808Q545,840 480,840ZM440,640L520,640Q537,640 548.5,628.5Q560,617 560,600Q560,583 548.5,571.5Q537,560 520,560L440,560Q423,560 411.5,571.5Q400,583 400,600Q400,617 411.5,628.5Q423,640 440,640ZM440,480L520,480Q537,480 548.5,468.5Q560,457 560,440Q560,423 548.5,411.5Q537,400 520,400L440,400Q423,400 411.5,411.5Q400,423 400,440Q400,457 411.5,468.5Q423,480 440,480Z"/>
<?xml version="1.0" encoding="utf-8"?><!--
~ This file is part of Lawnchair Launcher.
~
~ Lawnchair Launcher is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ Lawnchair Launcher is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with Lawnchair Launcher. If not, see <https://www.gnu.org/licenses/>.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M14,12H10V10H14M14,16H10V14H14M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8Z" />
</vector>
+10 -4
View File
@@ -1,5 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M360,600L236,600Q212,600 200.5,578.5Q189,557 203,537L502,107Q512,93 528,87.5Q544,82 561,88Q578,94 586,109Q594,124 592,141L560,400L715,400Q741,400 751.5,423Q762,446 745,466L416,860Q405,873 389,877Q373,881 358,874Q343,867 334.5,852.5Q326,838 328,821L360,600Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:name="vector"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:name="path"
android:fillColor="#000"
android:pathData="M10.75 23.625V14H7.25L14.25 0.875V10.5H17.75L10.75 23.625Z" />
</vector>
+11 -4
View File
@@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M480,691L314,791Q303,798 291,797Q279,796 270,789Q261,782 256,771.5Q251,761 254,748L298,559L151,432Q141,423 138.5,411.5Q136,400 140,389Q144,378 152,371Q160,364 174,362L368,345L443,167Q448,155 458.5,149Q469,143 480,143Q491,143 501.5,149Q512,155 517,167L592,345L786,362Q800,364 808,371Q816,378 820,389Q824,400 821.5,411.5Q819,423 809,432L662,559L706,748Q709,761 704,771.5Q699,782 690,789Q681,796 669,797Q657,798 646,791L480,691Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<clip-path android:pathData="M0,0h24v24h-24z" />
<path
android:fillColor="#ffffff"
android:pathData="M20.925,8.5467L15.2784,8.0567L13.0734,2.865C12.6767,1.92 11.3234,1.92 10.9267,2.865L8.7217,8.0683L3.0867,8.5467C2.06,8.6283 1.64,9.9117 2.4217,10.5883L6.7034,14.2983L5.42,19.805C5.1867,20.8083 6.2717,21.6017 7.1584,21.065L12,18.1483L16.8417,21.0767C17.7284,21.6133 18.8134,20.82 18.58,19.8167L17.2967,14.2983L21.5784,10.5883C22.36,9.9117 21.9517,8.6283 20.925,8.5467ZM12,15.9667L7.6134,18.615L8.78,13.6217L4.9067,10.2617L10.0167,9.8183L12,5.1167L13.995,9.83L19.105,10.2733L15.2317,13.6333L16.3984,18.6267L12,15.9667Z" />
</group>
</vector>
+9 -4
View File
@@ -1,5 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M160,840Q143,840 131.5,828.5Q120,817 120,800L120,703Q120,687 126,672.5Q132,658 143,647L648,143Q660,132 674.5,126Q689,120 705,120Q721,120 736,126Q751,132 762,144L817,200Q829,211 834.5,226Q840,241 840,256Q840,272 834.5,286.5Q829,301 817,313L313,817Q302,828 287.5,834Q273,840 257,840L160,840ZM704,312L760,256L704,200L648,256L704,312Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:fillType="evenOdd"
android:pathData="M3,21.0001V17.0001L15.5,4.5001C16.6046,3.3955 18.3954,3.3955 19.5,4.5001C20.6046,5.6046 20.6046,7.3955 19.5,8.5001L7,21.0001H3ZM6.1716,19.0001L18.0858,7.0858C18.4093,6.7623 18.4093,6.2378 18.0858,5.9143C17.7623,5.5908 17.2377,5.5908 16.9142,5.9143L5,17.8285V19.0001H6.1716Z" />
</vector>
+10 -4
View File
@@ -1,5 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L367,160Q383,160 397.5,166Q412,172 423,183L480,240L800,240Q833,240 856.5,263.5Q880,287 880,320L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?android:attr/textColorPrimary"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:pathData="M22,17C22,18.6569 20.6569,20 19,20H5C3.3431,20 2,18.6569 2,17V7C2,5.3432 3.3431,4 5,4H10L12,6H19C20.6569,6 22,7.3432 22,9V17ZM4,7V17C4,17.5523 4.4477,18 5,18H19C19.5523,18 20,17.5523 20,17V9C20,8.4477 19.5523,8 19,8H11L9,6H5C4.4477,6 4,6.4477 4,7Z" />
</vector>
+9 -4
View File
@@ -1,5 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M160,760L160,400Q160,381 168.5,364Q177,347 192,336L432,156Q453,140 480,140Q507,140 528,156L768,336Q783,347 791.5,364Q800,381 800,400L800,760Q800,793 776.5,816.5Q753,840 720,840L600,840Q583,840 571.5,828.5Q560,817 560,800L560,600Q560,583 548.5,571.5Q537,560 520,560L440,560Q423,560 411.5,571.5Q400,583 400,600L400,800Q400,817 388.5,828.5Q377,840 360,840L240,840Q207,840 183.5,816.5Q160,793 160,760Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:pathData="M12,3L1.7923,10.795C1.3545,11.1293 1.2701,11.7549 1.6037,12.1932C1.9383,12.6329 2.5663,12.7173 3.0051,12.3815L4,11.62V18C4,19.6569 5.3432,21 7,21H17C18.6569,21 20,19.6569 20,18V11.62L20.9998,12.3796C21.4367,12.7116 22.0598,12.6277 22.3934,12.1921C22.7283,11.7548 22.6449,11.1288 22.2071,10.7945L12,3ZM14,19H17C17.5523,19 18,18.5523 18,18V10.1L12,5.52L6,10.1V18C6,18.5523 6.4477,19 7,19H10V15C10,13.8954 10.8954,13 12,13C13.1046,13 14,13.8954 14,15V19Z" />
</vector>
+2 -2
View File
@@ -19,6 +19,6 @@
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@color/materialColorOnPrimaryFixed"
android:pathData="M263.72,864Q234,864 213,842.85Q192,821.7 192,792L192,408Q192,378.3 213.15,357.15Q234.3,336 264,336L288,336L288,240Q288,160.32 344.23,104.16Q400.45,48 480.23,48Q560,48 616,104.16Q672,160.32 672,240L672,336L696,336Q725.7,336 746.85,357.15Q768,378.3 768,408L768,792Q768,821.7 746.84,842.85Q725.68,864 695.96,864L263.72,864ZM264,792L696,792Q696,792 696,792Q696,792 696,792L696,408Q696,408 696,408Q696,408 696,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792ZM480.21,672Q510,672 531,650.79Q552,629.58 552,599.79Q552,570 530.79,549Q509.58,528 479.79,528Q450,528 429,549.21Q408,570.42 408,600.21Q408,630 429.21,651Q450.42,672 480.21,672ZM360,336L600,336L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,336ZM264,792Q264,792 264,792Q264,792 264,792L264,408Q264,408 264,408Q264,408 264,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792L264,792Z"/>
android:fillColor="?attr/materialColorOnPrimaryFixed"
android:pathData="M263.72,864Q234,864 213,842.85Q192,821.7 192,792L192,408Q192,378.3 213.15,357.15Q234.3,336 264,336L288,336L288,240Q288,160.32 344.23,104.16Q400.45,48 480.23,48Q560,48 616,104.16Q672,160.32 672,240L672,336L696,336Q725.7,336 746.85,357.15Q768,378.3 768,408L768,792Q768,821.7 746.84,842.85Q725.68,864 695.96,864L263.72,864ZM264,792L696,792Q696,792 696,792Q696,792 696,792L696,408Q696,408 696,408Q696,408 696,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792ZM480.21,672Q510,672 531,650.79Q552,629.58 552,599.79Q552,570 530.79,549Q509.58,528 479.79,528Q450,528 429,549.21Q408,570.42 408,600.21Q408,630 429.21,651Q450.42,672 480.21,672ZM360,336L600,336L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,336ZM264,792Q264,792 264,792Q264,792 264,792L264,408Q264,408 264,408Q264,408 264,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792L264,792Z" />
</vector>
+4 -4
View File
@@ -4,13 +4,13 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:fillType="nonZero"
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:pathData="M9,2C7.3432,2 6,3.3431 6,5V19C6,20.6569 7.3432,22 9,22H15C16.6569,22 18,20.6569 18,19V5C18,3.3431 16.6569,2 15,2H9ZM9,4C8.4477,4 8,4.4477 8,5V19C8,19.5523 8.4477,20 9,20H15C15.5523,20 16,19.5523 16,19V5C16,4.4477 15.5523,4 15,4H9Z" />
<path
android:fillColor="#000000"
android:fillColor="#ffffff"
android:pathData="M21,6L21,6A1,1 0,0 1,22 7L22,17A1,1 0,0 1,21 18L21,18A1,1 0,0 1,20 17L20,7A1,1 0,0 1,21 6z" />
<path
android:fillColor="#000000"
android:fillColor="#ffffff"
android:pathData="M3,6L3,6A1,1 0,0 1,4 7L4,17A1,1 0,0 1,3 18L3,18A1,1 0,0 1,2 17L2,7A1,1 0,0 1,3 6z" />
</vector>
+17 -4
View File
@@ -1,5 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M109,840Q98,840 89,834.5Q80,829 75,820Q70,811 69.5,800.5Q69,790 75,780L445,140Q451,130 460.5,125Q470,120 480,120Q490,120 499.5,125Q509,130 515,140L885,780Q891,790 890.5,800.5Q890,811 885,820Q880,829 871,834.5Q862,840 851,840L109,840ZM480,720Q497,720 508.5,708.5Q520,697 520,680Q520,663 508.5,651.5Q497,640 480,640Q463,640 451.5,651.5Q440,663 440,680Q440,697 451.5,708.5Q463,720 480,720ZM480,600Q497,600 508.5,588.5Q520,577 520,560L520,440Q520,423 508.5,411.5Q497,400 480,400Q463,400 451.5,411.5Q440,423 440,440L440,560Q440,577 451.5,588.5Q463,600 480,600Z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#00000000"
android:pathData="M3.6035,17.499L11.1346,4.4907C11.5197,3.8254 12.4803,3.8254 12.8654,4.4907L20.3965,17.499C20.7825,18.1656 20.3014,19 19.5311,19H4.4689C3.6986,19 3.2175,18.1656 3.6035,17.499Z"
android:strokeWidth="2"
android:strokeColor="#000000"
android:strokeLineJoin="round" />
<path
android:fillColor="#000000"
android:pathData="M12,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" />
<path
android:fillColor="#000000"
android:pathData="M12,9L12,9A1,1 0,0 1,13 10L13,12A1,1 0,0 1,12 13L12,13A1,1 0,0 1,11 12L11,10A1,1 0,0 1,12 9z" />
</vector>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="@dimen/profile_badge_size"
android:height="@dimen/profile_badge_size"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#11000000"
android:pathData="M.5,12.25
A11.5,11.5 0 1,1 23.5,12.25
A11.5,11.5 0 1,1 .5,12.25" />
<path
android:fillColor="@android:color/white"
android:pathData="M1,12
A11,11 0 1,1 23,12
A11,11 0 1,1 1,12" />
<group
android:pivotX="12"
android:pivotY="12"
android:scaleX=".6"
android:scaleY=".6">
<path
android:fillColor="#1A73E8"
android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z" />
</group>
</vector>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -19,8 +19,5 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto"
style="@style/BaseIcon"
android:textColor="?attr/folderTextColor"
android:includeFontPadding="false"
android:hapticFeedbackEnabled="false"
launcher:iconDisplay="drawer_folder"
launcher:centerVertically="true" />
launcher:iconDisplay="drawer_folder" />
@@ -25,8 +25,8 @@
android:paddingLeft="@dimen/dynamic_grid_cell_padding_x"
android:paddingRight="@dimen/dynamic_grid_cell_padding_x"
android:focusable="true" >
<com.android.launcher3.views.DoubleShadowBubbleTextView
style="@style/BaseIcon.AllApps"
<com.android.launcher3.BubbleTextView
style="@style/BaseIcon"
android:id="@+id/folder_icon_name"
android:focusable="false"
android:layout_gravity="top"
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2023 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -36,75 +35,45 @@
android:id="@+id/primary_widgets_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:clipToPadding="false" />
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/work_widgets_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:clipToPadding="false" />
</com.android.launcher3.widget.picker.WidgetPagedView>
<!-- SearchAndRecommendationsView contains the tab layout as well -->
<!-- SearchAndRecommendationsView without the tab layout as well -->
<com.android.launcher3.views.StickyHeaderLayout
android:id="@+id/search_and_recommendations_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/collapse_handle"
android:paddingBottom="0dp"
android:clipToOutline="true"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textSize="24sp"
android:layout_marginTop="24dp"
android:textColor="?attr/widgetPickerTitleColor"
android:text="@string/widget_button_text"/>
<FrameLayout
android:id="@+id/search_bar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="0.1dp"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:background="?attr/widgetPickerPrimarySurfaceColor"
android:clipToPadding="false"
android:elevation="0.1dp"
android:paddingBottom="8dp"
launcher:layout_sticky="true">
<include layout="@layout/widgets_search_bar" />
<ImageButton
android:id="@+id/widget_picker_widget_options_menu"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="end|bottom"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:background="@drawable/full_rounded_transparent_ripple"
android:contentDescription="@string/widget_picker_widget_options_button_description"
android:padding="12dp"
android:src="@drawable/ic_more_vert_dots"
android:visibility="gone"
android:tint="?attr/widgetPickerWidgetOptionsMenuColor" />
<include layout="@layout/widgets_search_bar" />
</FrameLayout>
<!-- Shown when there are recommendations to display -->
<LinearLayout
android:id="@+id/widget_recommendations_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:id="@+id/suggestions_header"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@drawable/widgets_surface_background"
android:clipToOutline="true"
android:orientation="vertical"
android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin"
android:visibility="gone">
<include layout="@layout/widget_recommendations" />
android:orientation="horizontal"
android:background="?attr/widgetPickerPrimarySurfaceColor"
launcher:layout_sticky="true">
</LinearLayout>
<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip
@@ -113,8 +82,8 @@
android:layout_height="64dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingBottom="8dp"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:paddingVertical="8dp"
android:background="?attr/widgetPickerPrimarySurfaceColor"
style="@style/TextHeadline"
launcher:layout_sticky="true">
@@ -143,6 +112,7 @@
android:textColor="@color/widget_picker_tab_text"
android:textSize="14sp"
style="?android:attr/borderlessButtonStyle" />
</com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip>
</com.android.launcher3.views.StickyHeaderLayout>
</FrameLayout>
@@ -15,70 +15,13 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto">
<LinearLayout
<FrameLayout
android:id="@+id/widgets_two_pane_sheet_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="start"
android:layout_gravity="start"
android:clipChildren="false"
android:layout_alignParentStart="true"
android:orientation="vertical">
<!-- SearchAndRecommendationsView without the tab layout as well -->
<LinearLayout
android:id="@+id/search_and_recommendations_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToOutline="true"
android:background="?attr/widgetPickerPrimarySurfaceColor"
android:orientation="vertical">
<LinearLayout
android:id="@+id/search_bar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:background="?attr/widgetPickerPrimarySurfaceColor"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
launcher:layout_sticky="true">
<FrameLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clipToPadding="false"
android:elevation="0.1dp"
android:paddingBottom="16dp">
<include layout="@layout/widgets_search_bar" />
</FrameLayout>
<ImageButton
android:id="@+id/widget_picker_widget_options_menu"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginBottom="16dp"
android:layout_gravity="bottom"
android:background="@drawable/full_rounded_transparent_ripple"
android:contentDescription="@string/widget_picker_widget_options_button_description"
android:padding="12dp"
android:src="@drawable/ic_more_vert_dots"
android:visibility="gone"
android:tint="?attr/widgetPickerWidgetOptionsMenuColor" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/suggestions_header"
android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
android:orientation="horizontal"
android:paddingBottom="16dp"
android:background="?attr/widgetPickerPrimarySurfaceColor"
launcher:layout_sticky="true">
</LinearLayout>
</LinearLayout>
android:layout_alignParentStart="true">
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/primary_widgets_list_view"
@@ -87,12 +30,39 @@
android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
android:clipToPadding="false" />
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/search_widgets_list_view"
<!-- SearchAndRecommendationsView without the tab layout as well -->
<com.android.launcher3.views.StickyHeaderLayout
android:id="@+id/search_and_recommendations_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
android:visibility="gone" />
</LinearLayout>
</merge>
android:layout_height="wrap_content"
android:clipToOutline="true"
android:orientation="vertical">
<FrameLayout
android:id="@+id/search_bar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/widgetPickerPrimarySurfaceColor"
android:clipToPadding="false"
android:elevation="0.1dp"
android:paddingBottom="8dp"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
launcher:layout_sticky="true">
<include layout="@layout/widgets_search_bar" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/suggestions_header"
android:layout_marginTop="8dp"
android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
android:paddingBottom="16dp"
android:orientation="horizontal"
android:background="?attr/widgetPickerPrimarySurfaceColor"
launcher:layout_sticky="true">
</LinearLayout>
</com.android.launcher3.views.StickyHeaderLayout>
</FrameLayout>
</merge>
+30 -29
View File
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2020 The Android Open Source Project
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -19,46 +21,45 @@
android:paddingTop="@dimen/work_edu_card_margin"
android:paddingBottom="@dimen/work_edu_card_bottom_margin"
android:gravity="center">
<LinearLayout
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/work_card"
android:layout_gravity="center_horizontal"
android:paddingEnd="@dimen/work_card_margin"
android:paddingStart="@dimen/work_card_margin"
android:paddingEnd="@dimen/work_card_margin_end"
android:paddingBottom="@dimen/work_card_margin"
android:paddingTop="@dimen/work_card_margin"
android:id="@+id/wrapper">
<TextView
style="@style/PrimaryHeadline"
android:textColor="?android:attr/textColorPrimary"
android:id="@+id/work_apps_paused_title"
android:layout_width="0dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="@dimen/work_card_margin"
android:paddingEnd="@dimen/work_edu_card_text_end_margin"
android:layout_marginBottom="@dimen/work_card_margin"
android:layout_marginEnd="@dimen/work_card_margin"
android:text="@string/work_profile_edu_work_apps"
android:textDirection="locale"
android:textSize="18sp" />
<FrameLayout
android:id="@+id/action_btn"
android:layout_width="@dimen/rounded_button_width"
android:layout_height="@dimen/rounded_button_width"
android:layout_marginTop="@dimen/work_edu_card_button_margin_top"
android:clickable="true"
android:contentDescription="@string/accessibility_close"
android:gravity="center"
android:background="@drawable/inset_rounded_action_button">
<ImageButton
android:layout_width="@dimen/x_icon_size"
android:layout_height="@dimen/x_icon_size"
android:clickable="false"
android:scaleType="centerInside"
android:layout_gravity="center"
android:importantForAccessibility="no"
android:background="@android:color/transparent"
android:src="@drawable/ic_close_work_edu" />
</FrameLayout>
</LinearLayout>
</com.android.launcher3.allapps.WorkEduCard>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/padded_rounded_button_height"
android:orientation="horizontal">
<FrameLayout
android:layout_width="@dimen/rounded_button_width"
android:layout_height="@dimen/rounded_button_width"
android:layout_alignParentEnd="true"
android:padding="@dimen/rounded_button_padding">
<ImageView
android:id="@+id/action_btn"
android:layout_width="@dimen/x_icon_size"
android:layout_height="@dimen/x_icon_size"
android:layout_gravity="center"
android:contentDescription="@string/accessibility_close"
android:src="@drawable/ic_close" />
</FrameLayout>
</RelativeLayout>
</RelativeLayout>
</com.android.launcher3.allapps.WorkEduCard>
+1 -1
View File
@@ -97,7 +97,7 @@
<string name="config_default_web_suggestion_provider" translatable="false">google</string>
<!-- which overlay to use by default -->
<string name="config_default_overlay" translatable="false">none</string>
<string name="config_default_overlay" translatable="false">suck_in</string>
<!-- swipe gesture key -->
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2025, Lawnchair
~ Copyright 2021, Lawnchair
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -92,7 +92,7 @@
<dimen name="page_indicator_dot_margin">3dp</dimen>
<dimen name="page_indicator_dot_size">6dp</dimen>
<dimen name="page_indicator_padding_start">2dp</dimen>
<dimen name="page_indicator_padding_top_bottom">10dp</dimen>
<dimen name="page_indicator_padding_top_bottom">8dp</dimen>
<dimen name="page_indicator_width">16dp</dimen>
<dimen name="smartspace_icon_shadow">1dp</dimen>
<dimen name="status_bar_header_height_keyguard">40dp</dimen>
+25 -35
View File
@@ -166,6 +166,8 @@
<string name="home_screen_label">Home screen</string>
<string name="home_screen_description">Feed, grid, icons</string>
<string name="home_screen_actions">Home screen actions</string>
<string name="dock_label">Dock</string>
<string name="dock_description">Search bar, icon count</string>
@@ -191,12 +193,6 @@
<string name="experimental_features_label">Experimental features</string>
<!-- Experimental features -->
<string name="workspace_label">Workspace</string>
<string name="smartspace_label">Smartspace</string>
<string name="internal_label">Internal</string>
<string name="internal_description">Internal may be more unstable than other experimental group</string>
<string name="font_picker_label">Font customization</string>
<string name="font_picker_description">Some text remains unchanged</string>
@@ -208,7 +204,6 @@
<string name="always_reload_icons_label">Always reload icons</string>
<string name="always_reload_icons_description">Avoid using cached icons from icon packs</string>
<string name="always_reload_icons_warning">Will cause icon to reload regularly, this is not required if icon pack doesn\'t update regularly</string>
<string name="icon_swipe_gestures">Icon swipe gestures</string>
<string name="icon_swipe_gestures_description">Perform actions when swiping left or right on icons instead of moving the home screen</string>
@@ -216,14 +211,6 @@
<string name="show_deck_layout">Deck layout</string>
<string name="show_deck_layout_description">Show a layout option to hide the app drawer and automatically add new apps to the home screen</string>
<string name="material_expressive_label">Material 3 Expressive</string>
<string name="material_expressive_description">Enable Material 3 Expressive changes in workspace</string>
<string name="gesturenavcontract_label">GestureNavContract API</string>
<string name="gesturenavcontract_description">Render launcher animations without root, does not work with heavily modified AOSP</string>
<string name="gesturenavcontract_warning_incompatibility">GestureNavContract may cause artifacting during animations</string>
<string name="recents_lock_unlock">Lock/unlock</string>
<string name="recents_lock_unlock_description">Prevent selected app from closing when pressing \"Clear all\"</string>
@@ -277,6 +264,9 @@
<string name="reset_custom_icons">Reset custom icons</string>
<string name="reset_custom_icons_confirmation">All custom icons will be reset. Do you want to continue?</string>
<string name="remove_all_views_from_home_screen">Clear home screen</string>
<string name="remove_all_views_from_home_screen_desc">Home screen will be cleared. Do you want to continue?</string>
<!-- Icon picker -->
<string name="icon_picker_default_category">Icons</string>
<string name="icon_picker_reset_to_default">Reset to default</string>
@@ -299,9 +289,7 @@
<string name="icon_shape_square">Square</string>
<string name="icon_shape_squircle">Squircle</string>
<string name="icon_shape_teardrop">Teardrop</string>
<!-- Icon shapes (Material 3 Expressive) -->
<string name="icon_shape_very_sunny">Very sunny</string>
<string name="icon_shape_complex_clover">Complex clover</string>
<!-- Icon shape (Material 3 Expressive) -->
<string name="icon_shape_four_sided_cookie">Four-sided cookie</string>
<string name="icon_shape_seven_sided_cookie">Seven-sided cookie</string>
<string name="icon_shape_arch">Arch</string>
@@ -412,17 +400,18 @@
<!-- Date formats -->
<string name="smartspace_calendar_gregorian">Gregorian</string>
<string name="smartspace_calendar_persian">Persian</string>
<string name="smartspace_calendar_lunar">Lunar</string>
<string name="generic_smartspace_concatenated_desc">%1$s, %2$s</string>
<string name="smartspace_icu_date_pattern_gregorian_wday_month_day_no_year" translatable="false">EEEMMMd</string>
<string name="smartspace_icu_date_pattern_gregorian_time" translatable="false">HH:mm</string>
<string name="smartspace_icu_date_pattern_gregorian_time_12h" translatable="false">hh:mm aa</string>
<string name="smartspace_icu_date_pattern_gregorian_date" translatable="false"> dd MMMM</string>
<string name="smartspace_icu_date_pattern_persian_wday_month_day_no_year" translatable="false">l، j F</string>
<string name="smartspace_icu_date_pattern_persian_time" translatable="false">H:i</string>
<string name="smartspace_icu_date_pattern_persian_time_12h" translatable="false">g:i a</string>
<string name="smartspace_icu_date_pattern_persian_date" translatable="false">"j F، "</string>
<!-- Battery labels -->
<string name="smartspace_battery_fast_charging">Fast charging</string>
<string name="smartspace_battery_slow_charging">Slow charging</string>
<string name="smartspace_battery_charging">Charging</string>
<string name="smartspace_battery_full">Charged</string>
<string name="smartspace_battery_low">Battery low</string>
@@ -502,8 +491,6 @@
<string name="contributor_status_active">Active</string>
<string name="update_check_failed">Failed to check for updates</string>
<string name="major_update_label">Breaking change!</string>
<string name="major_update_description">You are about to update from Lawnchair <xliff:g example="15" id="current_major_version">%1$s</xliff:g> to Lawnchair <xliff:g example="16" id="next_major_version">%2$s</xliff:g>, please consider carefully as newer major version may be unstable than current version.</string>
<!--
@@ -539,7 +526,6 @@
<string name="gesture_handler_sleep">Sleep</string>
<string name="gesture_handler_recents">Open Recents screen</string>
<string name="gesture_handler_open_notifications">Open notification panel</string>
<string name="gesture_handler_open_quick_settings">Open Quick Settings</string>
<string name="gesture_handler_open_app_option">Open app</string>
<string name="gesture_handler_open_app_config">Open %1$s</string>
<string name="gesture_handler_open_app_drawer">Open app drawer</string>
@@ -550,18 +536,15 @@
<string name="pick_app_for_gesture">Pick app</string>
<string name="dt2s_admin_hint_title">Admin permissions required</string>
<string name="dt2s_admin_hint">To put the device to sleep, set Lawnchair as a device admin app. Tap \"Open settings\", then tap \"Activate this device admin app.\"</string>
<string name="dt2s_admin_warning">Gestures to put the device to sleep will be turned off.</string>
<string name="dt2s_admin_hint">To use Double-Tap to Sleep, set Lawnchair as a device admin app. Tap \"Open settings\", then tap \"Activate this device admin app.\"</string>
<string name="dt2s_admin_warning">Double-Tap to Sleep will be turned off.</string>
<string name="d2ts_recents_a11y_hint_title">Turn on accessibility service</string>
<string name="dt2s_a11y_hint">To use Double-Tap to Sleep, turn on the Lawnchair accessibility service. Tap \"Open settings\", select \"Lawnchair\" and turn on \"Use Lawnchair.\"\n\nLawnchair uses Accessibility\'s `performGlobalAction` method to perform this action. This is a sensitive permission that allows monitoring other apps. However, Lawnchair is not configured for that functionality and receives no events.</string>
<string name="dt2s_recents_warning_open_settings">Open settings</string>
<string name="sleep_a11y_hint">put the device to sleep</string>
<string name="notifications_fallback_a11y_hint">open the notification panel</string>
<string name="quick_settings_a11y_hint">open the Quick Settings panel</string>
<string name="recents_screen_a11y_hint">open the Recents screen</string>
<string name="generic_a11y_hint">To %1$s, turn on the Lawnchair accessibility service. Tap \"Open settings\", select \"Lawnchair\" and turn on \"Use Lawnchair.\"</string>
<string name="generic_a11y_disclaimer">Lawnchair uses Accessibility\'s `performGlobalAction` method to perform this action. This is a sensitive permission that allows monitoring other apps. However, Lawnchair is not configured for that functionality and receives no events.</string>
<string name="recents_a11y_hint">To use Open Recents screen, turn on the Lawnchair accessibility service. Tap \"Open settings\", select \"Lawnchair\" and turn on \"Use Lawnchair.\"\n\nLawnchair uses Accessibility\'s `performGlobalAction` method to perform this action. This is a sensitive permission that allows monitoring other apps. However, Lawnchair is not configured for that functionality and receives no events.</string>
<!--
@@ -609,16 +592,21 @@
<string name="wallpaper_depth_effect_label">Wallpaper depth effect</string>
<string name="wallpaper_depth_effect_description">Zoom in and out of the wallpaper when transitioning between areas of the launcher</string>
<string name="show_sys_ui_scrim">Top shadow</string>
<string name="infinite_scrolling_label">Infinite scrolling</string>
<string name="infinite_scrolling_description">Swipe to loop between the first and last pages</string>
<string name="home_screen_grid">Home screen grid</string>
<string name="home_screen_lock">Lock home screen</string>
<string name="home_screen_unlock">Unlock home screen</string>
<string name="home_screen_locked">Home screen is locked</string>
<string name="home_screen_lock_description">Prevent changes to the home screen layout</string>
<string name="show_dot_pagination_label">Show dot pagination</string>
<string name="show_dot_pagination_description">Use dots instead of lines to show page number</string>
<string name="show_material_u_popup_label">Use new pop-up style</string>
<string name="show_material_u_popup_description">Use Material You\'s bouncy and slightly consolidated pop-up style</string>
<string name="popup_menu">Pop-up menu</string>
<string name="popup_menu_items">Pop-up menu items</string>
<string name="edit_menu_items">Edit pop-up menu items</string>
@@ -909,4 +897,6 @@
<string name="grant_requested_permissions">Grant permissions</string>
<string name="permissions_needed">Permissions needed</string>
<string name="grant_requested_permissions_tap">Tap to grant permissions</string>
<!-- Message shown when all home screen views are removed -->
<string name="home_screen_all_views_removed_msg">Home screen cleared</string>
</resources>
+8 -9
View File
@@ -51,8 +51,8 @@
</grid-option>
<grid-option
launcher:name="4_by_7"
launcher:numRows="7"
launcher:name="4_by_5"
launcher:numRows="5"
launcher:numColumns="4"
launcher:numFolderRows="3"
launcher:numFolderColumns="3"
@@ -116,16 +116,16 @@
</grid-option>
<grid-option
launcher:name="7_by_7"
launcher:numRows="7"
launcher:numColumns="7"
launcher:name="5_by_5"
launcher:numRows="5"
launcher:numColumns="5"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:numHotseatIcons="5"
launcher:numExtendedHotseatIcons="6"
launcher:dbFile="launcher_7_by_7.db"
launcher:dbFile="launcher_5_by_5.db"
launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_split"
launcher:defaultLayoutId="@xml/default_workspace_7x7"
launcher:defaultLayoutId="@xml/default_workspace_5x5"
launcher:deviceCategory="phone|multi_display" >
<display-option
@@ -174,7 +174,6 @@
launcher:devicePaddingId="@xml/paddings_6x5"
launcher:dbFile="launcher_6_by_5.db"
launcher:defaultLayoutId="@xml/default_workspace_6x5"
launcher:inlineQsb="landscape"
launcher:deviceCategory="tablet" >
<display-option
@@ -442,4 +441,4 @@
launcher:transientTaskbarIconSize="52.8"/>
</grid-option>
</profiles>
</profiles>
+3 -11
View File
@@ -15,9 +15,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
@@ -37,7 +35,7 @@ class BlankActivity : ComponentActivity() {
private var firstResume = true
private var targetStarted = false
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
@@ -55,18 +53,12 @@ class BlankActivity : ComponentActivity() {
AlertDialog(
onDismissRequest = { if (!targetStarted) finish() },
confirmButton = {
Button(
onClick = { startTargetActivity() },
shapes = ButtonDefaults.shapes(),
) {
Button(onClick = { startTargetActivity() }) {
Text(text = intent.getStringExtra("positiveButton")!!)
}
},
dismissButton = {
OutlinedButton(
onClick = { finish() },
shapes = ButtonDefaults.shapes(),
) {
OutlinedButton(onClick = { finish() }) {
Text(text = stringResource(id = android.R.string.cancel))
}
},
@@ -9,18 +9,11 @@ import com.android.launcher3.InvariantDeviceProfile.INDEX_DEFAULT
import com.android.launcher3.InvariantDeviceProfile.INDEX_LANDSCAPE
import com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_LANDSCAPE
import com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_PORTRAIT
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.util.DaggerSingletonObject
import com.android.launcher3.util.MainThreadInitializedObject
import com.android.launcher3.util.SafeCloseable
import com.patrykmichalik.opto.core.firstBlocking
import javax.inject.Inject
@LauncherAppSingleton
class DeviceProfileOverrides @Inject constructor(
@ApplicationContext private val context: Context,
) : SafeCloseable {
class DeviceProfileOverrides(context: Context) : SafeCloseable {
private val prefs = PreferenceManager.getInstance(context)
private val preferenceManager2 = PreferenceManager2.getInstance(context)
@@ -158,6 +151,6 @@ class DeviceProfileOverrides @Inject constructor(
companion object {
@JvmField
val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getDPO)
val INSTANCE = MainThreadInitializedObject(::DeviceProfileOverrides)
}
}
@@ -9,13 +9,9 @@ import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
import androidx.core.content.edit
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.util.DaggerSingletonObject
import com.android.launcher3.Utilities
import com.android.launcher3.util.MainThreadInitializedObject
import com.android.launcher3.util.SafeCloseable
import javax.inject.Inject
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.channels.awaitClose
@@ -27,13 +23,10 @@ import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.plus
@LauncherAppSingleton
class HeadlessWidgetsManager @Inject constructor(
@ApplicationContext private val context: Context,
) : SafeCloseable {
class HeadlessWidgetsManager(private val context: Context) : SafeCloseable {
private val scope = MainScope() + CoroutineName("HeadlessWidgetsManager")
private val prefs = LauncherPrefs.getDevicePrefs(context)
private val prefs = Utilities.getDevicePrefs(context)
private val widgetManager = AppWidgetManager.getInstance(context)
private val host = HeadlessAppWidgetHost(context)
private val widgetsMap = mutableMapOf<String, Widget>()
@@ -134,6 +127,6 @@ class HeadlessWidgetsManager @Inject constructor(
companion object {
val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getHeadlessWidgetsManager)
val INSTANCE = MainThreadInitializedObject(::HeadlessWidgetsManager)
}
}
@@ -0,0 +1,23 @@
package app.lawnchair
import android.content.Context
import android.content.pm.LauncherActivityInfo
import androidx.annotation.Keep
import app.lawnchair.preferences.PreferenceManager
import com.android.launcher3.icons.LauncherActivityCachingLogic as BaseLogic
import com.android.launcher3.util.ComponentKey
@Keep
class LauncherActivityCachingLogic(context: Context) : BaseLogic() {
private val prefs = PreferenceManager.getInstance(context)
override fun getLabel(info: LauncherActivityInfo): CharSequence {
val key = ComponentKey(info.componentName, info.user)
val customLabel = prefs.customAppName[key]
if (!customLabel.isNullOrEmpty()) {
return customLabel
}
return super.getLabel(info)
}
}
@@ -30,9 +30,6 @@ import android.util.Log
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.requiredWidth
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
@@ -236,7 +233,6 @@ class LawnchairApp : Application() {
@JvmStatic
val isAtleastT: Boolean get() = instance.isAtleastT
@OptIn(ExperimentalMaterial3ExpressiveApi::class, ExperimentalMaterial3Api::class)
fun Launcher.showQuickstepWarningIfNecessary() {
val launcher = this
if (!lawnchairApp.isRecentsComponent || isRecentsEnabled) return
@@ -257,14 +253,12 @@ class LawnchairApp : Application() {
openAppInfo(launcher)
close(true)
},
shapes = ButtonDefaults.shapes(),
) {
Text(text = stringResource(id = R.string.app_info_drop_target_label))
}
Spacer(modifier = Modifier.requiredWidth(8.dp))
Button(
onClick = { close(true) },
shapes = ButtonDefaults.shapes(),
) {
Text(text = stringResource(id = android.R.string.ok))
}
@@ -20,6 +20,7 @@ import android.animation.AnimatorSet
import android.app.ActivityOptions
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.RectF
import android.graphics.drawable.Drawable
import android.os.Bundle
@@ -28,6 +29,8 @@ import android.view.Display
import android.view.View
import android.view.ViewTreeObserver
import android.window.SplashScreen
import androidx.activity.SystemBarStyle
import androidx.activity.enableEdgeToEdge
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.lifecycleScope
@@ -35,6 +38,7 @@ import app.lawnchair.LawnchairApp.Companion.showQuickstepWarningIfNecessary
import app.lawnchair.compat.LawnchairQuickstepCompat
import app.lawnchair.data.AppDatabase
import app.lawnchair.data.wallpaper.service.WallpaperService
import app.lawnchair.factory.LawnchairWidgetHolder
import app.lawnchair.gestures.GestureController
import app.lawnchair.gestures.VerticalSwipeTouchController
import app.lawnchair.gestures.config.GestureHandlerConfig
@@ -72,7 +76,6 @@ import com.android.launcher3.util.RunnableList
import com.android.launcher3.util.SystemUiController.UI_STATE_BASE_WINDOW
import com.android.launcher3.util.Themes
import com.android.launcher3.util.TouchController
import com.android.launcher3.util.WallpaperThemeManager
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.OptionsPopupView
import com.android.launcher3.views.OptionsPopupView.OptionItem
@@ -94,11 +97,7 @@ class LawnchairLauncher : QuickstepLauncher() {
private val defaultOverlay by unsafeLazy { OverlayCallbackImpl(this) }
private val prefs by unsafeLazy { PreferenceManager.getInstance(this) }
private val preferenceManager2 by unsafeLazy { PreferenceManager2.getInstance(this) }
private val insetsController: WindowInsetsControllerCompat by lazy {
val window = launcher.window
?: throw Exception("WindowInsetsControllerCompat not available.")
WindowInsetsControllerCompat(window, rootView)
}
private val insetsController by unsafeLazy { WindowInsetsControllerCompat(launcher.window, rootView) }
private val themeProvider by unsafeLazy { ThemeProvider.INSTANCE.get(this) }
private val noStatusBarStateListener = object : StateManager.StateListener<LauncherState> {
override fun onStateTransitionStart(toState: LauncherState) {
@@ -153,6 +152,14 @@ class LawnchairLauncher : QuickstepLauncher() {
val gestureController by unsafeLazy { GestureController(this) }
override fun onCreate(savedInstanceState: Bundle?) {
if (!Utilities.ATLEAST_Q) {
enableEdgeToEdge(
navigationBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
),
)
}
layoutInflater.factory2 = LawnchairLayoutFactory(this)
super.onCreate(savedInstanceState)
@@ -221,7 +228,7 @@ class LawnchairLauncher : QuickstepLauncher() {
}
val isWorkspaceDarkText = Themes.getAttrBoolean(this, R.attr.isWorkspaceDarkText)
preferenceManager2.darkStatusBar.onEach(launchIn = lifecycleScope) { darkStatusBar ->
systemUiController?.updateUiState(UI_STATE_BASE_WINDOW, isWorkspaceDarkText || darkStatusBar)
systemUiController.updateUiState(UI_STATE_BASE_WINDOW, isWorkspaceDarkText || darkStatusBar)
}
preferenceManager2.backPressGestureHandler.onEach(launchIn = lifecycleScope) { handler ->
hasBackGesture = handler !is GestureHandlerConfig.NoOp
@@ -260,11 +267,11 @@ class LawnchairLauncher : QuickstepLauncher() {
),
)
fun updateTheme() {
override fun updateTheme() {
if (themeProvider.colorScheme != colorScheme) {
recreate()
} else {
WallpaperThemeManager(this).updateTheme()
super.updateTheme()
}
}
@@ -297,7 +304,7 @@ class LawnchairLauncher : QuickstepLauncher() {
}
override fun handleGestureContract(intent: Intent?) {
if (!LawnchairApp.isRecentsEnabled && prefs.enableGnc.get()) {
if (!LawnchairApp.isRecentsEnabled) {
val gnc = GestureNavContract.fromIntent(intent)
if (gnc != null) {
AbstractFloatingView.closeOpenViews(
@@ -354,7 +361,7 @@ class LawnchairLauncher : QuickstepLauncher() {
view.iconView.setBackgroundDrawable(item.icon)
view.bubbleText.text = item.label
view.setOnClickListener(popup)
view.setOnLongClickListener(popup)
view.onLongClickListener = popup
popup.mItemMap[view] = item
}
@@ -362,12 +369,15 @@ class LawnchairLauncher : QuickstepLauncher() {
return popup
}
fun createAppWidgetHolder(): LauncherWidgetHolder {
val holder = LauncherWidgetHolder.newInstance(this)
holder.setAppWidgetRemovedCallback { appWidgetId ->
workspace.removeWidget(appWidgetId)
override fun createAppWidgetHolder(): LauncherWidgetHolder {
val factory = LauncherWidgetHolder.HolderFactory.newFactory(this) as LawnchairWidgetHolder.LawnchairHolderFactory
return factory.newInstance(
this,
) { appWidgetId: Int ->
workspace.removeWidget(
appWidgetId,
)
}
return holder
}
override fun makeDefaultActivityOptions(splashScreenStyle: Int): ActivityOptionsWrapper {
@@ -489,7 +499,7 @@ class LawnchairLauncher : QuickstepLauncher() {
if (
preferenceManager2.alwaysReloadIcons.firstBlocking()
) {
LauncherAppState.getInstance(this).model.reloadIfActive()
LauncherAppState.getInstance(this).reloadIcons()
}
}
@@ -499,7 +509,7 @@ class LawnchairLauncher : QuickstepLauncher() {
var sRestartFlags = 0
val instance get() = LauncherAppState.getInstance(LawnchairApp.instance) as? LawnchairLauncher
val instance get() = LauncherAppState.getInstanceNoCreate()?.launcher as? LawnchairLauncher
}
}
@@ -2,10 +2,11 @@ package app.lawnchair
import android.content.Context
import androidx.annotation.Keep
import androidx.arch.core.util.Function
import app.lawnchair.bugreport.LawnchairBugReporter
import app.lawnchair.theme.color.tokens.ColorTokens
import com.android.launcher3.Utilities
import com.android.launcher3.icons.mono.ThemedIconDrawable
import com.android.launcher3.icons.ThemedIconDrawable
import com.android.quickstep.QuickstepProcessInitializer
@Keep
@@ -13,7 +14,7 @@ class LawnchairProcessInitializer(context: Context) : QuickstepProcessInitialize
override fun init(context: Context) {
LawnchairBugReporter.INSTANCE.get(context)
ThemedIconDrawable.COLORS_LOADER = {
ThemedIconDrawable.COLORS_LOADER = Function {
if (Utilities.isDarkTheme(it)) {
intArrayOf(
ColorTokens.Accent2_800.resolveColor(it),
@@ -4,13 +4,9 @@ import android.content.Context
import android.content.pm.PackageManager
import android.service.notification.StatusBarNotification
import app.lawnchair.util.checkPackagePermission
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.notification.NotificationListener
import com.android.launcher3.util.DaggerSingletonObject
import com.android.launcher3.util.MainThreadInitializedObject
import com.android.launcher3.util.SafeCloseable
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.Flow
@@ -18,10 +14,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@LauncherAppSingleton
class NotificationManager @Inject constructor(
@ApplicationContext private val context: Context,
) : SafeCloseable {
class NotificationManager(@Suppress("UNUSED_PARAMETER") context: Context) : SafeCloseable {
private val scope = MainScope()
private val notificationsMap = mutableMapOf<String, StatusBarNotification>()
@@ -62,7 +55,7 @@ class NotificationManager @Inject constructor(
}
companion object {
@JvmField val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getNotificationManager)
@JvmField val INSTANCE = MainThreadInitializedObject(::NotificationManager)
}
}
@@ -2,7 +2,6 @@ package app.lawnchair
import android.os.CancellationSignal
import android.view.WindowInsets
import android.view.animation.Interpolator
import androidx.core.view.WindowInsetsCompat
import app.lawnchair.preferences2.PreferenceManager2
import com.android.app.animation.Interpolators
@@ -41,49 +40,7 @@ class SearchBarStateHandler(private val launcher: LawnchairLauncher) : StateMana
config: StateAnimationConfig,
animation: PendingAnimation,
) {
if (shouldAnimateKeyboardShow(toState)) {
if (Utilities.ATLEAST_R) {
val editText = launcher.appsView.searchUiManager.editText
editText?.requestFocus()
val handler = SearchBarShowInsetsHandler(launcher.allAppsController.shiftRange)
val cancellationSignal = CancellationSignal()
val windowInsetsController = launcher.appsView.windowInsetsController
val interpolator = getKeyboardInterpolator(
isUserControlled = config.isUserControlled,
)
windowInsetsController?.controlWindowInsetsAnimation(
WindowInsets.Type.ime(),
-1,
interpolator,
cancellationSignal,
handler,
)
animation.setFloat(
handler.progress,
AnimatedFloat.VALUE,
1f,
interpolator,
)
animation.addListener(
forEndCallback(
Runnable {
handler.onAnimationEnd()
cancellationSignal.cancel()
},
),
)
} else {
animation.addListener(
forSuccessCallback {
showKeyboard()
},
)
}
return
}
if (shouldAnimateKeyboardHide(toState)) {
if (shouldAnimateKeyboard(toState)) {
if (Utilities.ATLEAST_R) {
val handler = SearchBarInsetsHandler(launcher.allAppsController.shiftRange)
val cancellationSignal = CancellationSignal()
@@ -117,35 +74,28 @@ class SearchBarStateHandler(private val launcher: LawnchairLauncher) : StateMana
)
}
}
}
private fun shouldAnimateKeyboardShow(toState: LauncherState): Boolean {
if (!autoShowKeyboard || !Utilities.ATLEAST_R) return false
// If you are in Workspace and going somewhere that isn't AllApps, then false!
if (!launcher.isInState(LauncherState.NORMAL) || toState != LauncherState.ALL_APPS) return false
val insets = launcher.rootView.rootWindowInsets ?: return false
val isImeVisible = WindowInsetsCompat.toWindowInsetsCompat(insets).isVisible(WindowInsetsCompat.Type.ime())
return !isImeVisible
if (launcher.isInState(LauncherState.NORMAL) && toState == LauncherState.ALL_APPS) {
if (autoShowKeyboard) {
val progress = AnimatedFloat()
animation.setFloat(progress, AnimatedFloat.VALUE, 1f, Interpolators.LINEAR)
animation.addListener(
forSuccessCallback {
if (progress.value > 0.5f) {
showKeyboard()
}
},
)
}
}
}
private fun shouldAnimateKeyboardHide(toState: LauncherState): Boolean {
private fun shouldAnimateKeyboard(toState: LauncherState): Boolean {
val windowInsets = launcher.rootView.rootWindowInsets ?: return false
val rootWindowInsets = WindowInsetsCompat.toWindowInsetsCompat(windowInsets)
val keyboardVisible = rootWindowInsets.isVisible(WindowInsetsCompat.Type.ime())
// Keyboard is visible, AND you are in AllApps and going somewhere else that isn't AllApps!
return keyboardVisible && launcher.isInState(LauncherState.ALL_APPS) && toState != LauncherState.ALL_APPS
}
private fun getKeyboardInterpolator(isUserControlled: Boolean): Interpolator {
return if (isUserControlled) {
Interpolators.clampToProgress(Interpolators.EMPHASIZED_ACCELERATE, 0.35f, 1.0f)
} else {
Interpolators.LINEAR
}
}
private fun showKeyboard() {
val editText = launcher.appsView.searchUiManager.editText ?: return
editText.showKeyboard()

Some files were not shown because too many files have changed in this diff Show More