Compare commits
343 Commits
Author | SHA1 | Date |
---|---|---|
Tibor Kaputa | 77088de585 | |
Tibor Kaputa | ce4137500f | |
Tibor Kaputa | b25d42e806 | |
Tibor Kaputa | 99b572a73f | |
Eric | e4343706ea | |
Eric | b2cebd9b85 | |
VfBFan | e22f1f6881 | |
Puppelimies | 0a0f116cd0 | |
Puppelimies | 454566a288 | |
Tibor Kaputa | 4af01ae1f1 | |
Tibor Kaputa | 1e9c0e64a5 | |
Milo Ivir | 1518e9ea5f | |
winver | 2d5def9b95 | |
Josep M. Ferrer | 75e3d424a5 | |
winver | ee6568d62a | |
Agnieszka C | 23f7b0e7aa | |
tibbi | f9d82dcac8 | |
Tibor Kaputa | 5dab74e00b | |
gallegonovato | 85c7c4a10f | |
Tibor Kaputa | 8bdbae498e | |
Ensar Sarajčić | a091f4ff4c | |
tibbi | 6038aac349 | |
tibbi | 44668e15c0 | |
tibbi | 2b5074bdec | |
Tibor Kaputa | d69cb4e3ea | |
Ensar Sarajčić | 9e9d305158 | |
Ensar Sarajčić | 200109e527 | |
Tibor Kaputa | 2349fa019c | |
Ensar Sarajčić | a26c29cd89 | |
Tibor Kaputa | bb90255e34 | |
Tibor Kaputa | d383f371e5 | |
Ensar Sarajčić | 9e24c7c37d | |
Ensar Sarajčić | 545c424bd5 | |
Tibor Kaputa | 2614be4f42 | |
Ensar Sarajčić | 149ea23fa5 | |
Tibor Kaputa | aa6a7cd31a | |
Tibor Kaputa | e2954c68a9 | |
gallegonovato | 23f191e70a | |
Peter Dave Hello | 26fdc7c590 | |
gallegonovato | a9553b6a3c | |
Tibor Kaputa | 7b1b083f7f | |
Ensar Sarajčić | 681e50993f | |
Ensar Sarajčić | 78d9459e9a | |
Ensar Sarajčić | 0a239b1d06 | |
Ensar Sarajčić | 28e0f2d59f | |
Ensar Sarajčić | 65ace16fbf | |
Ensar Sarajčić | f8fccf9444 | |
Ensar Sarajčić | 571f1c1af4 | |
Ensar Sarajčić | e70a476198 | |
Ensar Sarajčić | d9a9c70be8 | |
Ensar Sarajčić | c8fc80e037 | |
Ensar Sarajčić | e2367dd5a9 | |
Ensar Sarajčić | d9e333ddb0 | |
Ensar Sarajčić | 4f5fda2c52 | |
Ensar Sarajčić | 924521c405 | |
Ensar Sarajčić | b15673b8a2 | |
Ensar Sarajčić | 6766e46c37 | |
Tibor Kaputa | f46b6fcc2c | |
Tibor Kaputa | 24f3132641 | |
Tibor Kaputa | f5d4949728 | |
Ensar Sarajčić | 887cce5e67 | |
Ensar Sarajčić | d50d5702ba | |
Ensar Sarajčić | 988c3148ac | |
Tibor Kaputa | 6e9d8686bf | |
Ensar Sarajčić | 8b6a6fd948 | |
tibbi | 222cca23f9 | |
tibbi | 8991cb54f8 | |
tibbi | ed92e1c9d2 | |
Tibor Kaputa | 43b016fa2d | |
Ensar Sarajčić | 44674ef47f | |
Tibor Kaputa | 9e9aae015a | |
Ensar Sarajčić | ebb08d420c | |
Tibor Kaputa | 02b249e5a8 | |
Tibor Kaputa | 248159fa84 | |
Goran Gharib Karim | 16225b2b68 | |
Goran Gharib Karim | 189b459cb2 | |
Tibor Kaputa | a1a960428a | |
Tibor Kaputa | 9f951ea3bc | |
Ensar Sarajčić | 92decdd66d | |
Tibor Kaputa | 1c0a559517 | |
Tibor Kaputa | 2f6e0aaf53 | |
Ensar Sarajčić | afa46e76bf | |
Ensar Sarajčić | 91c8664ca1 | |
Ensar Sarajčić | 9159ecbd44 | |
Ensar Sarajčić | 677b4083d8 | |
Tibor Kaputa | 8202e5dde7 | |
Ensar Sarajčić | ab8164ccdc | |
Tibor Kaputa | 5b2bd753b8 | |
Ensar Sarajčić | 1698c18d7c | |
Sergio Marques | 9c30c8c12b | |
Tibor Kaputa | 13d91a5c3d | |
Ensar Sarajčić | 63a61dfb2d | |
Tibor Kaputa | 60a4c31a88 | |
Ensar Sarajčić | 017d50756d | |
Tibor Kaputa | 8fcbc4cb10 | |
Ensar Sarajčić | 9bfff57405 | |
Tibor Kaputa | 5218eb17c0 | |
Tibor Kaputa | 8ee21b43a1 | |
Tibor Kaputa | 0ca194a6e6 | |
Usland | 3c4375634c | |
Ensar Sarajčić | 096d9d26c9 | |
Ensar Sarajčić | 253a157b28 | |
Ensar Sarajčić | 73224b436f | |
Ensar Sarajčić | 1dc3ee0af4 | |
Ensar Sarajčić | 7048a4c56f | |
Tibor Kaputa | f25738a40f | |
Ensar Sarajčić | b7eecc5663 | |
Ensar Sarajčić | e88eb05e00 | |
Ensar Sarajčić | 1fcda210b6 | |
Ensar Sarajčić | 3f146c7618 | |
Ensar Sarajčić | 75aeade4af | |
Ensar Sarajčić | e5adb450c2 | |
Ensar Sarajčić | 6d3b138459 | |
Ensar Sarajčić | 3dd78cc911 | |
Ensar Sarajčić | 1863a9e6a9 | |
Ensar Sarajčić | ece3890133 | |
Tibor Kaputa | 5f67ff94c0 | |
J. Lavoie | 4ff3dd7e19 | |
J. Lavoie | 2dd44a9886 | |
Tibor Kaputa | a1b459f396 | |
Ensar Sarajčić | 3cc00157cc | |
Ensar Sarajčić | a34bab78af | |
Ensar Sarajčić | 6c8800f266 | |
Ensar Sarajčić | 59975c77f4 | |
Ensar Sarajčić | 53efffde51 | |
Ensar Sarajčić | 8f96073e45 | |
Ensar Sarajčić | d4f55b8e8b | |
Ensar Sarajčić | 95cf8c0384 | |
Ensar Sarajčić | 7a5c698322 | |
Ensar Sarajčić | a7ffb6328a | |
Ensar Sarajčić | 81dff807b4 | |
Ensar Sarajčić | 516f61fe90 | |
Ensar Sarajčić | a5499a58ad | |
Tibor Kaputa | 50f345808c | |
en2sv | 06efcfd3fd | |
Ensar Sarajčić | cca2ceaab9 | |
Ensar Sarajčić | c83e7a5226 | |
Ensar Sarajčić | 62686f48c3 | |
Ensar Sarajčić | 10603be76b | |
Ensar Sarajčić | dfe9b04f71 | |
Ensar Sarajčić | dc6f263e79 | |
Ensar Sarajčić | 55ebb2eb15 | |
Ensar Sarajčić | 62a3faf8ea | |
Ensar Sarajčić | c049b41c1a | |
Ensar Sarajčić | b9e55d4934 | |
Tibor Kaputa | 47a92c3b66 | |
Tibor Kaputa | 810775dfff | |
Milan Šalka | e22220fb68 | |
Tibor Kaputa | 07c26bfd18 | |
spkprs | 9374661151 | |
tibbi | ad7ba47ce6 | |
Tibor Kaputa | bf71d48f23 | |
Ensar Sarajčić | 8f21b8b689 | |
Ensar Sarajčić | 36558b8949 | |
Ensar Sarajčić | 651d3b041c | |
Ensar Sarajčić | 079efbedb3 | |
Ensar Sarajčić | 2bdd29454b | |
Ensar Sarajčić | c15b3e4c6f | |
Tibor Kaputa | b2a2ee653c | |
Priit Jõerüüt | cd994f2c04 | |
Kingproone | 43dfcebb5a | |
Tibor Kaputa | 6e89e55c70 | |
Ensar Sarajčić | 5e58c04338 | |
Ensar Sarajčić | a9f879628c | |
Ensar Sarajčić | 4e1121e6af | |
Ensar Sarajčić | 564d92f7a7 | |
Ensar Sarajčić | 3fc14045b6 | |
Ensar Sarajčić | 6096a4da3e | |
Tibor Kaputa | 65f4cf4b0a | |
Ensar Sarajčić | 310f81f850 | |
Ensar Sarajčić | bc7bf7bb78 | |
Ensar Sarajčić | 72d85f6257 | |
Tibor Kaputa | c4b7480a4c | |
solokot | 63768045c8 | |
VfBFan | af6e1790b2 | |
Agnieszka C | 7d493085f0 | |
Tibor Kaputa | 308d9841eb | |
Tibor Kaputa | 45904bac9d | |
Ensar Sarajčić | 6a57c9c823 | |
Ensar Sarajčić | 3426fd98e3 | |
Ensar Sarajčić | 83a35664a4 | |
Ensar Sarajčić | 7f787cef08 | |
Ensar Sarajčić | e82beb464d | |
Ensar Sarajčić | 0a1af2f75e | |
Ensar Sarajčić | babd6bee9d | |
Ensar Sarajčić | 38f1983bf7 | |
Tibor Kaputa | 73b7638a93 | |
Rex_sa | 4b85da1124 | |
Guillaume | fceb63e4c8 | |
Josep M. Ferrer | 4ced1cfb09 | |
Oğuz Ersen | 6754e58c6a | |
Eric | 4f60029e33 | |
Ensar Sarajčić | 4fa8131f21 | |
Ensar Sarajčić | 27b12764a5 | |
Tibor Kaputa | 37e0bd6084 | |
Tibor Kaputa | c8db594896 | |
Ensar Sarajčić | ad6f129876 | |
tibbi | f751d90bea | |
Tibor Kaputa | d331d70131 | |
Ensar Sarajčić | 1e4e2571dd | |
Ensar Sarajčić | 56255c0b48 | |
Ensar Sarajčić | 792ded4323 | |
Tibor Kaputa | 8d6c839c15 | |
Ensar Sarajčić | 5b318a4f59 | |
Ensar Sarajčić | fd46c078fb | |
Ensar Sarajčić | 0b497a34f6 | |
Tibor Kaputa | f3b0c7363a | |
Ensar Sarajčić | befd1d5d09 | |
Ensar Sarajčić | 2534131851 | |
Ensar Sarajčić | 240193d0f5 | |
Ensar Sarajčić | 5c7ad336ad | |
Ensar Sarajčić | 2fefcf0cba | |
Ensar Sarajčić | 57df13f74e | |
Tibor Kaputa | 2b951ad277 | |
Sergio Marques | 489c4f827e | |
solokot | 4f0f8d08fd | |
Josep M. Ferrer | 1e2ba6d637 | |
en2sv | 9cdd4a79b3 | |
Rex_sa | 2ddb063ac6 | |
Guillaume | 8a39918420 | |
Priit Jõerüüt | 265d66e93a | |
VfBFan | 10bdb0682d | |
Oğuz Ersen | e769c2cc48 | |
Agnieszka C | 651de2bc4e | |
Eric | d1ce1b950c | |
Ensar Sarajčić | e0d1151e8c | |
Ensar Sarajčić | 66c480b46d | |
Tibor Kaputa | a3c7aa0d5d | |
Tibor Kaputa | c643f06b6d | |
Tibor Kaputa | 94633c08ff | |
Ensar Sarajčić | f8cd74912c | |
Ensar Sarajčić | d1b888ee7e | |
Ensar Sarajčić | 68a8b5dd25 | |
Ensar Sarajčić | 02684f393f | |
Tibor Kaputa | 90ac44d54b | |
Tibor Kaputa | 0a76968091 | |
Ensar Sarajčić | 2038e9dcf1 | |
Ensar Sarajčić | 4392527909 | |
Ensar Sarajčić | 1b0dc44ca8 | |
Ensar Sarajčić | 8794f7ca23 | |
Ensar Sarajčić | 35fe1da420 | |
Ensar Sarajčić | 9906ef05af | |
Ensar Sarajčić | efb46dc0d6 | |
Ensar Sarajčić | 1448c8a989 | |
Ensar Sarajčić | 05c9644037 | |
Ensar Sarajčić | 1c67a8f097 | |
Ensar Sarajčić | 6ac3d0f86c | |
Ensar Sarajčić | 3742762220 | |
Tibor Kaputa | 240c568d1d | |
Tibor Kaputa | a766abf248 | |
Tibor Kaputa | f6176f0d85 | |
Ensar Sarajčić | d4b131ab23 | |
Ensar Sarajčić | 9766b3f0b6 | |
Tibor Kaputa | 99443c3297 | |
Ensar Sarajčić | d5aff09c8e | |
Ensar Sarajčić | 1913d0b739 | |
Ensar Sarajčić | 3a4f4b47a9 | |
Tibor Kaputa | 273846423e | |
Ensar Sarajčić | f0eb1254a3 | |
Ensar Sarajčić | 9dc9e90e0e | |
Ensar Sarajčić | 1d0f814e9f | |
Ensar Sarajčić | 468b89bc21 | |
Ensar Sarajčić | b0ca17cea2 | |
Ensar Sarajčić | 10a06020e8 | |
Ensar Sarajčić | a429fba97f | |
Ensar Sarajčić | 5655eba657 | |
Ensar Sarajčić | 26b4d777e4 | |
Ensar Sarajčić | 8c9862c9c9 | |
Tibor Kaputa | c5ea727398 | |
Tibor Kaputa | 1a640224a2 | |
Tibor Kaputa | f2de755423 | |
Tibor Kaputa | 29acee4f78 | |
Ensar Sarajčić | 65835d4bcb | |
Ensar Sarajčić | a4fc9d0b90 | |
Ensar Sarajčić | d1cc743f2e | |
Ensar Sarajčić | 3ec2bd2034 | |
Ensar Sarajčić | 0581c18d81 | |
Ensar Sarajčić | 26fee5c53f | |
Ensar Sarajčić | 149e51f53e | |
Ensar Sarajčić | fe1e59297d | |
Ensar Sarajčić | dffca7823c | |
Ensar Sarajčić | 43d5e2031a | |
tibbi | 8972ffc1f6 | |
tibbi | f3dce51add | |
Tibor Kaputa | f951f02620 | |
Tibor Kaputa | 9b30452083 | |
abc0922001 | e54655247a | |
Josep M. Ferrer | f84e21bb12 | |
VfBFan | 56968e7fa6 | |
abc0922001 | 73fffb9082 | |
abc0922001 | 17798cd1d6 | |
Tibor Kaputa | 6f1ce87af0 | |
Ensar Sarajčić | 649a55a1fa | |
Ensar Sarajčić | 913cbb303d | |
Ensar Sarajčić | 1c114f782e | |
Ensar Sarajčić | 209c74e99b | |
Ensar Sarajčić | 1097159b8d | |
Ensar Sarajčić | 3e45c3311e | |
Ensar Sarajčić | d0f361c531 | |
Ensar Sarajčić | e00f6852ed | |
Ensar Sarajčić | 4b1f2e5a65 | |
Ensar Sarajčić | 822b373a72 | |
Ensar Sarajčić | 5d642eefe2 | |
Ensar Sarajčić | 3545701f21 | |
Tibor Kaputa | dda1080ccd | |
Tibor Kaputa | 31986af875 | |
Rex_sa | 56c5ff77c3 | |
Guillaume | 29fd4c7144 | |
solokot | 0e5c674d61 | |
Oğuz Ersen | 604c8bdc42 | |
Agnieszka C | 267faa88b3 | |
Eric | be7df2d4fd | |
Ensar Sarajčić | 934651e88d | |
Ensar Sarajčić | 2636f5666e | |
spkprs | 3659cc35ed | |
Tibor Kaputa | c5b07a4254 | |
Tibor Kaputa | 6397240dce | |
elgratea | bcc1352d8c | |
elgratea | 482617bcf1 | |
Tibor Kaputa | 6c98f3ec11 | |
Tibor Kaputa | 48ee02374a | |
Ensar Sarajčić | 46b43359de | |
Ensar Sarajčić | b49a84968e | |
Ensar Sarajčić | ec45fc0a1f | |
Ensar Sarajčić | 3ed5119129 | |
Ensar Sarajčić | ee914d889a | |
Ensar Sarajčić | 1cbc887c3c | |
Ensar Sarajčić | 79d047c852 | |
Ensar Sarajčić | f4adf578d4 | |
Ensar Sarajčić | 7bbdf581de | |
tibbi | 552b7e561a | |
Tibor Kaputa | 2ce56163f8 | |
FTno | 8f3163874e | |
tibbi | 7acbd0286c | |
Tibor Kaputa | e8b95052dc | |
Milo Ivir | 83ef06948e | |
Denis Shilin | 36246d948b | |
P.O | 00fe1a63a0 | |
Oskari Lavinto | 881a1db4be | |
Gabriel Camargo | d742fd7e42 | |
Dan | 37a2498ecb | |
Tibor Kaputa | 06b1be6da2 | |
tibbi | 15f9dea230 |
22
CHANGELOG.md
|
@ -1,6 +1,28 @@
|
|||
Changelog
|
||||
==========
|
||||
|
||||
Version 5.1.1 *(2023-09-23)*
|
||||
----------------------------
|
||||
|
||||
* Allow creating multiple home screen pages
|
||||
* Added folder support
|
||||
* Added shortcut support
|
||||
* Added search
|
||||
* Allow changing row and column count
|
||||
* Improved accessibility talkback
|
||||
* Added some UX, translation and stability improvements
|
||||
|
||||
Version 5.1.0 *(2023-09-19)*
|
||||
----------------------------
|
||||
|
||||
* Allow creating multiple home screen pages
|
||||
* Added folder support
|
||||
* Added shortcut support
|
||||
* Added search
|
||||
* Allow changing row and column count
|
||||
* Improved accessibility talkback
|
||||
* Added some UX, translation and stability improvements
|
||||
|
||||
Version 5.0.6 *(2023-02-12)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
### Reporting
|
||||
Before you report something, read the reporting rules [here](https://github.com/SimpleMobileTools/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please.
|
||||
|
||||
### Contributing as a developer
|
||||
Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/SimpleMobileTools/General-Discussion#contribution-rules-for-developers) section.
|
||||
|
||||
### Contributing as a non developer
|
||||
In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file).
|
|
@ -34,7 +34,7 @@ Telegram:
|
|||
https://t.me/SimpleMobileTools
|
||||
|
||||
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.launcher'><img src='https://simplemobiletools.com/images/button-google-play.svg' alt='Get it on Google Play' height=45/></a>
|
||||
<a href='https://f-droid.org/packages/com.simplemobiletools.launcher'><img src='https://simplemobiletools.com/images/button-f-droid.png' alt='Get it on F-Droid' height='45' /></a>
|
||||
<a href='https://f-droid.org/packages/com.simplemobiletools.launcher'><img src='https://simplemobiletools.com/images/button-fdroid.svg' alt='Get it on F-Droid' height='45' /></a>
|
||||
|
||||
<div style="display:flex;">
|
||||
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png" width="30%">
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
|
||||
def keystorePropertiesFile = rootProject.file("keystore.properties")
|
||||
def keystoreProperties = new Properties()
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.simplemobiletools.launcher"
|
||||
minSdkVersion 26
|
||||
targetSdkVersion 33
|
||||
versionCode 8
|
||||
versionName "5.0.6"
|
||||
setProperty("archivesBaseName", "launcher")
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
release {
|
||||
keyAlias keystoreProperties['keyAlias']
|
||||
keyPassword keystoreProperties['keyPassword']
|
||||
storeFile file(keystoreProperties['storeFile'])
|
||||
storePassword keystoreProperties['storePassword']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
}
|
||||
release {
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flavorDimensions "variants"
|
||||
productFlavors {
|
||||
core {}
|
||||
fdroid {}
|
||||
prepaid {}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
checkReleaseBuilds false
|
||||
abortOnError false
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.github.SimpleMobileTools:Simple-Commons:c457573200'
|
||||
|
||||
kapt "androidx.room:room-compiler:2.5.0"
|
||||
implementation "androidx.room:room-runtime:2.5.0"
|
||||
annotationProcessor "androidx.room:room-compiler:2.5.0"
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
import java.io.FileInputStream
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
import org.jetbrains.kotlin.konan.properties.Properties
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.android)
|
||||
alias(libs.plugins.kotlinAndroid)
|
||||
alias(libs.plugins.ksp)
|
||||
base
|
||||
}
|
||||
|
||||
base {
|
||||
archivesName.set("launcher")
|
||||
}
|
||||
|
||||
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
|
||||
val keystoreProperties = Properties()
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt()
|
||||
|
||||
defaultConfig {
|
||||
applicationId = libs.versions.app.version.appId.get()
|
||||
minSdk = project.libs.versions.app.build.minimumSDK.get().toInt()
|
||||
targetSdk = project.libs.versions.app.build.targetSDK.get().toInt()
|
||||
versionName = project.libs.versions.app.version.versionName.get()
|
||||
versionCode = project.libs.versions.app.version.versionCode.get().toInt()
|
||||
ksp {
|
||||
arg("room.schemaLocation", "$projectDir/schemas")
|
||||
}
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
register("release") {
|
||||
keyAlias = keystoreProperties.getProperty("keyAlias")
|
||||
keyPassword = keystoreProperties.getProperty("keyPassword")
|
||||
storeFile = file(keystoreProperties.getProperty("storeFile"))
|
||||
storePassword = keystoreProperties.getProperty("storePassword")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
viewBinding = true
|
||||
buildConfig = true
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
applicationIdSuffix = ".debug"
|
||||
}
|
||||
release {
|
||||
isMinifyEnabled = true
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
)
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
signingConfig = signingConfigs.getByName("release")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flavorDimensions.add("variants")
|
||||
productFlavors {
|
||||
register("core")
|
||||
register("fdroid")
|
||||
register("prepaid")
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
getByName("main").java.srcDirs("src/main/kotlin")
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get().toString())
|
||||
sourceCompatibility = currentJavaVersionFromLibs
|
||||
targetCompatibility = currentJavaVersionFromLibs
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile> {
|
||||
kotlinOptions.jvmTarget = project.libs.versions.app.build.kotlinJVMTarget.get()
|
||||
}
|
||||
|
||||
namespace = libs.versions.app.version.appId.get()
|
||||
|
||||
lint {
|
||||
checkReleaseBuilds = false
|
||||
abortOnError = false
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(libs.simple.tools.commons)
|
||||
|
||||
implementation(libs.bundles.room)
|
||||
ksp(libs.androidx.room.compiler)
|
||||
}
|
|
@ -0,0 +1,128 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 1,
|
||||
"identityHash": "ed53de48a7908dc5cd3640f7bb9a3090",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "apps",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `package_name` TEXT NOT NULL, `order` INTEGER NOT NULL, `thumbnail_color` INTEGER NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "order",
|
||||
"columnName": "order",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "thumbnailColor",
|
||||
"columnName": "thumbnail_color",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_apps_package_name",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"package_name"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_apps_package_name` ON `${TABLE_NAME}` (`package_name`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "home_screen_grid_items",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `package_name` TEXT NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "left",
|
||||
"columnName": "left",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "top",
|
||||
"columnName": "top",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "right",
|
||||
"columnName": "right",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "bottom",
|
||||
"columnName": "bottom",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_home_screen_grid_items_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_home_screen_grid_items_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ed53de48a7908dc5cd3640f7bb9a3090')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,164 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 2,
|
||||
"identityHash": "15057b03e1991ec0d06e1894e5e65e2a",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "apps",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `package_name` TEXT NOT NULL, `order` INTEGER NOT NULL, `thumbnail_color` INTEGER NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "order",
|
||||
"columnName": "order",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "thumbnailColor",
|
||||
"columnName": "thumbnail_color",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_apps_package_name",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"package_name"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_apps_package_name` ON `${TABLE_NAME}` (`package_name`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "home_screen_grid_items",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `package_name` TEXT NOT NULL, `title` TEXT NOT NULL, `type` INTEGER NOT NULL, `class_name` TEXT NOT NULL, `widget_id` INTEGER NOT NULL, `intent` TEXT NOT NULL, `icon` BLOB)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "left",
|
||||
"columnName": "left",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "top",
|
||||
"columnName": "top",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "right",
|
||||
"columnName": "right",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "bottom",
|
||||
"columnName": "bottom",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "type",
|
||||
"columnName": "type",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "className",
|
||||
"columnName": "class_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "widgetId",
|
||||
"columnName": "widget_id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "intent",
|
||||
"columnName": "intent",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "icon",
|
||||
"columnName": "icon",
|
||||
"affinity": "BLOB",
|
||||
"notNull": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_home_screen_grid_items_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_home_screen_grid_items_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '15057b03e1991ec0d06e1894e5e65e2a')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,182 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 3,
|
||||
"identityHash": "e49f06a0d5b16868d7812ed341895b88",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "apps",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `order` INTEGER NOT NULL, `thumbnail_color` INTEGER NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "order",
|
||||
"columnName": "order",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "thumbnailColor",
|
||||
"columnName": "thumbnail_color",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_apps_package_name",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"package_name"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_apps_package_name` ON `${TABLE_NAME}` (`package_name`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "home_screen_grid_items",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL, `type` INTEGER NOT NULL, `class_name` TEXT NOT NULL, `widget_id` INTEGER NOT NULL, `intent` TEXT NOT NULL, `shortcut_id` TEXT NOT NULL, `icon` BLOB)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "left",
|
||||
"columnName": "left",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "top",
|
||||
"columnName": "top",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "right",
|
||||
"columnName": "right",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "bottom",
|
||||
"columnName": "bottom",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "type",
|
||||
"columnName": "type",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "className",
|
||||
"columnName": "class_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "widgetId",
|
||||
"columnName": "widget_id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "intent",
|
||||
"columnName": "intent",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "shortcutId",
|
||||
"columnName": "shortcut_id",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "icon",
|
||||
"columnName": "icon",
|
||||
"affinity": "BLOB",
|
||||
"notNull": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_home_screen_grid_items_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_home_screen_grid_items_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e49f06a0d5b16868d7812ed341895b88')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,230 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 4,
|
||||
"identityHash": "040f7c2f7cba89bc76cd78abe496d6dc",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "apps",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `order` INTEGER NOT NULL, `thumbnail_color` INTEGER NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "order",
|
||||
"columnName": "order",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "thumbnailColor",
|
||||
"columnName": "thumbnail_color",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_apps_package_name",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"package_name"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_apps_package_name` ON `${TABLE_NAME}` (`package_name`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "home_screen_grid_items",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL, `type` INTEGER NOT NULL, `class_name` TEXT NOT NULL, `widget_id` INTEGER NOT NULL, `intent` TEXT NOT NULL, `shortcut_id` TEXT NOT NULL, `icon` BLOB)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "left",
|
||||
"columnName": "left",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "top",
|
||||
"columnName": "top",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "right",
|
||||
"columnName": "right",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "bottom",
|
||||
"columnName": "bottom",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "type",
|
||||
"columnName": "type",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "className",
|
||||
"columnName": "class_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "widgetId",
|
||||
"columnName": "widget_id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "intent",
|
||||
"columnName": "intent",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "shortcutId",
|
||||
"columnName": "shortcut_id",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "icon",
|
||||
"columnName": "icon",
|
||||
"affinity": "BLOB",
|
||||
"notNull": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_home_screen_grid_items_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_home_screen_grid_items_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "hidden_icons",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"autoGenerate": true
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_hidden_icons_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hidden_icons_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '040f7c2f7cba89bc76cd78abe496d6dc')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,242 @@
|
|||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 5,
|
||||
"identityHash": "38ee4c5e67d8efd6cd89925eea5da205",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "apps",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `order` INTEGER NOT NULL, `thumbnail_color` INTEGER NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "order",
|
||||
"columnName": "order",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "thumbnailColor",
|
||||
"columnName": "thumbnail_color",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"autoGenerate": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_apps_package_name",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"package_name"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_apps_package_name` ON `${TABLE_NAME}` (`package_name`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "home_screen_grid_items",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `page` INTEGER NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL, `type` INTEGER NOT NULL, `class_name` TEXT NOT NULL, `widget_id` INTEGER NOT NULL, `shortcut_id` TEXT NOT NULL, `icon` BLOB, `docked` INTEGER NOT NULL, `parent_id` INTEGER)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "left",
|
||||
"columnName": "left",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "top",
|
||||
"columnName": "top",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "right",
|
||||
"columnName": "right",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "bottom",
|
||||
"columnName": "bottom",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "page",
|
||||
"columnName": "page",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "type",
|
||||
"columnName": "type",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "className",
|
||||
"columnName": "class_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "widgetId",
|
||||
"columnName": "widget_id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "shortcutId",
|
||||
"columnName": "shortcut_id",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "icon",
|
||||
"columnName": "icon",
|
||||
"affinity": "BLOB",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "docked",
|
||||
"columnName": "docked",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "parentId",
|
||||
"columnName": "parent_id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"autoGenerate": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_home_screen_grid_items_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_home_screen_grid_items_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
},
|
||||
{
|
||||
"tableName": "hidden_icons",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "packageName",
|
||||
"columnName": "package_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "activityName",
|
||||
"columnName": "activity_name",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"columnName": "title",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"autoGenerate": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_hidden_icons_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_hidden_icons_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '38ee4c5e67d8efd6cd89925eea5da205')"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.simplemobiletools.launcher"
|
||||
android:installLocation="internalOnly">
|
||||
|
||||
<uses-permission
|
||||
|
@ -28,6 +27,7 @@
|
|||
android:appCategory="productivity"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_launcher_name"
|
||||
android:localeConfig="@xml/locale_config"
|
||||
android:roundIcon="@mipmap/ic_launcher"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
|
@ -43,13 +43,19 @@
|
|||
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||
android:excludeFromRecents="true"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/LauncherTheme">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.content.pm.action.CONFIRM_PIN_SHORTCUT" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
|
@ -96,7 +102,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -115,7 +120,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -134,7 +138,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -153,7 +156,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -172,7 +174,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -191,7 +192,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -210,7 +210,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -229,7 +228,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -248,7 +246,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -267,7 +264,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -286,7 +282,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -305,7 +300,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -324,7 +318,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -343,7 +336,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -362,7 +354,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -381,7 +372,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -400,7 +390,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -419,7 +408,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
@ -438,7 +426,6 @@
|
|||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
|
|
@ -5,35 +5,42 @@ import android.content.pm.PackageManager
|
|||
import android.os.Bundle
|
||||
import com.simplemobiletools.commons.extensions.beVisibleIf
|
||||
import com.simplemobiletools.commons.extensions.normalizeString
|
||||
import com.simplemobiletools.commons.extensions.viewBinding
|
||||
import com.simplemobiletools.commons.helpers.NavigationIcon
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import com.simplemobiletools.commons.views.MyGridLayoutManager
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.adapters.HiddenIconsAdapter
|
||||
import com.simplemobiletools.launcher.extensions.getColumnCount
|
||||
import com.simplemobiletools.launcher.databinding.ActivityHiddenIconsBinding
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import com.simplemobiletools.launcher.extensions.getDrawableForPackageName
|
||||
import com.simplemobiletools.launcher.extensions.hiddenIconsDB
|
||||
import com.simplemobiletools.launcher.models.HiddenIcon
|
||||
import kotlinx.android.synthetic.main.activity_hidden_icons.*
|
||||
|
||||
class HiddenIconsActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
private val binding by viewBinding(ActivityHiddenIconsBinding::inflate)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_hidden_icons)
|
||||
setContentView(binding.root)
|
||||
updateIcons()
|
||||
|
||||
updateMaterialActivityViews(manage_hidden_icons_coordinator, manage_hidden_icons_list, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(manage_hidden_icons_list, manage_hidden_icons_toolbar)
|
||||
updateMaterialActivityViews(
|
||||
binding.manageHiddenIconsCoordinator,
|
||||
binding.manageHiddenIconsList,
|
||||
useTransparentNavigation = true,
|
||||
useTopSearchMenu = false
|
||||
)
|
||||
setupMaterialScrollListener(binding.manageHiddenIconsList, binding.manageHiddenIconsToolbar)
|
||||
|
||||
val layoutManager = manage_hidden_icons_list.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = getColumnCount()
|
||||
val layoutManager = binding.manageHiddenIconsList.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = config.drawerColumnCount
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(manage_hidden_icons_toolbar, NavigationIcon.Arrow)
|
||||
setupToolbar(binding.manageHiddenIconsToolbar, NavigationIcon.Arrow)
|
||||
}
|
||||
|
||||
private fun updateIcons() {
|
||||
|
@ -46,7 +53,11 @@ class HiddenIconsActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
|||
})
|
||||
).toMutableList() as ArrayList<HiddenIcon>
|
||||
|
||||
manage_hidden_icons_placeholder.beVisibleIf(hiddenIcons.isEmpty())
|
||||
val hiddenIconsEmpty = hiddenIcons.isEmpty()
|
||||
runOnUiThread {
|
||||
binding.manageHiddenIconsPlaceholder.beVisibleIf(hiddenIconsEmpty)
|
||||
}
|
||||
|
||||
if (hiddenIcons.isNotEmpty()) {
|
||||
val intent = Intent(Intent.ACTION_MAIN, null)
|
||||
intent.addCategory(Intent.CATEGORY_LAUNCHER)
|
||||
|
@ -73,9 +84,9 @@ class HiddenIconsActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
|||
}
|
||||
|
||||
runOnUiThread {
|
||||
HiddenIconsAdapter(this, hiddenIcons, this, manage_hidden_icons_list) {
|
||||
HiddenIconsAdapter(this, hiddenIcons, this, binding.manageHiddenIconsList) {
|
||||
}.apply {
|
||||
manage_hidden_icons_list.adapter = this
|
||||
binding.manageHiddenIconsList.adapter = this
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,47 +2,65 @@ package com.simplemobiletools.launcher.activities
|
|||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.NavigationIcon
|
||||
import com.simplemobiletools.commons.helpers.isTiramisuPlus
|
||||
import com.simplemobiletools.commons.models.FAQItem
|
||||
import com.simplemobiletools.commons.models.RadioItem
|
||||
import com.simplemobiletools.launcher.BuildConfig
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.databinding.ActivitySettingsBinding
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import kotlinx.android.synthetic.main.activity_settings.*
|
||||
import java.util.*
|
||||
import com.simplemobiletools.launcher.helpers.MAX_COLUMN_COUNT
|
||||
import com.simplemobiletools.launcher.helpers.MAX_ROW_COUNT
|
||||
import com.simplemobiletools.launcher.helpers.MIN_COLUMN_COUNT
|
||||
import com.simplemobiletools.launcher.helpers.MIN_ROW_COUNT
|
||||
import java.util.Locale
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class SettingsActivity : SimpleActivity() {
|
||||
|
||||
private val binding by viewBinding(ActivitySettingsBinding::inflate)
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_settings)
|
||||
setContentView(binding.root)
|
||||
|
||||
updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar)
|
||||
updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar)
|
||||
setupOptionsMenu()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(settings_toolbar, NavigationIcon.Arrow)
|
||||
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
|
||||
refreshMenuItems()
|
||||
|
||||
setupPurchaseThankYou()
|
||||
setupCustomizeColors()
|
||||
setupUseEnglish()
|
||||
setupCloseAppDrawerOnOtherAppOpen()
|
||||
setupDrawerColumnCount()
|
||||
setupDrawerSearchBar()
|
||||
setupHomeRowCount()
|
||||
setupHomeColumnCount()
|
||||
setupLanguage()
|
||||
setupManageHiddenIcons()
|
||||
updateTextColors(settings_holder)
|
||||
updateTextColors(binding.settingsHolder)
|
||||
|
||||
arrayOf(settings_color_customization_section_label, settings_general_settings_label).forEach {
|
||||
arrayOf(
|
||||
binding.settingsColorCustomizationSectionLabel,
|
||||
binding.settingsGeneralSettingsLabel,
|
||||
binding.settingsDrawerSettingsLabel,
|
||||
binding.settingsHomeScreenLabel
|
||||
).forEach {
|
||||
it.setTextColor(getProperPrimaryColor())
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupOptionsMenu() {
|
||||
settings_toolbar.setOnMenuItemClickListener { menuItem ->
|
||||
binding.settingsToolbar.setOnMenuItemClickListener { menuItem ->
|
||||
when (menuItem.itemId) {
|
||||
R.id.about -> launchAbout()
|
||||
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
|
||||
|
@ -53,45 +71,119 @@ class SettingsActivity : SimpleActivity() {
|
|||
}
|
||||
|
||||
private fun refreshMenuItems() {
|
||||
settings_toolbar.menu.apply {
|
||||
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations)
|
||||
binding.settingsToolbar.menu.apply {
|
||||
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupPurchaseThankYou() {
|
||||
settings_purchase_thank_you_holder.beGoneIf(isOrWasThankYouInstalled())
|
||||
settings_purchase_thank_you_holder.setOnClickListener {
|
||||
binding.settingsPurchaseThankYouHolder.beGoneIf(isOrWasThankYouInstalled())
|
||||
binding.settingsPurchaseThankYouHolder.setOnClickListener {
|
||||
launchPurchaseThankYouIntent()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupCustomizeColors() {
|
||||
settings_color_customization_label.text = getCustomizeColorsString()
|
||||
settings_color_customization_holder.setOnClickListener {
|
||||
binding.settingsColorCustomizationLabel.text = getCustomizeColorsString()
|
||||
binding.settingsColorCustomizationHolder.setOnClickListener {
|
||||
startCustomizationActivity()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupUseEnglish() {
|
||||
settings_use_english_holder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
|
||||
settings_use_english.isChecked = config.useEnglish
|
||||
settings_use_english_holder.setOnClickListener {
|
||||
settings_use_english.toggle()
|
||||
config.useEnglish = settings_use_english.isChecked
|
||||
binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
|
||||
binding.settingsUseEnglish.isChecked = config.useEnglish
|
||||
binding.settingsUseEnglishHolder.setOnClickListener {
|
||||
binding.settingsUseEnglish.toggle()
|
||||
config.useEnglish = binding.settingsUseEnglish.isChecked
|
||||
exitProcess(0)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupCloseAppDrawerOnOtherAppOpen() {
|
||||
binding.settingsCloseAppDrawerOnOtherApp.isChecked = config.closeAppDrawer
|
||||
binding.settingsCloseAppDrawerOnOtherAppHolder.setOnClickListener {
|
||||
binding.settingsCloseAppDrawerOnOtherApp.toggle()
|
||||
config.closeAppDrawer = binding.settingsCloseAppDrawerOnOtherApp.isChecked
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupDrawerColumnCount() {
|
||||
val currentColumnCount = config.drawerColumnCount
|
||||
binding.settingsDrawerColumnCount.text = currentColumnCount.toString()
|
||||
binding.settingsDrawerColumnCountHolder.setOnClickListener {
|
||||
val items = ArrayList<RadioItem>()
|
||||
for (i in 1..MAX_COLUMN_COUNT) {
|
||||
items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.column_counts, i, i)))
|
||||
}
|
||||
|
||||
RadioGroupDialog(this, items, currentColumnCount) {
|
||||
val newColumnCount = it as Int
|
||||
if (currentColumnCount != newColumnCount) {
|
||||
config.drawerColumnCount = newColumnCount
|
||||
setupDrawerColumnCount()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupDrawerSearchBar() {
|
||||
val showSearchBar = config.showSearchBar
|
||||
binding.settingsShowSearchBar.isChecked = showSearchBar
|
||||
binding.settingsDrawerSearchHolder.setOnClickListener {
|
||||
binding.settingsShowSearchBar.toggle()
|
||||
config.showSearchBar = binding.settingsShowSearchBar.isChecked
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupHomeRowCount() {
|
||||
val currentRowCount = config.homeRowCount
|
||||
binding.settingsHomeScreenRowCount.text = currentRowCount.toString()
|
||||
binding.settingsHomeScreenRowCountHolder.setOnClickListener {
|
||||
val items = ArrayList<RadioItem>()
|
||||
for (i in MIN_ROW_COUNT..MAX_ROW_COUNT) {
|
||||
items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.row_counts, i, i)))
|
||||
}
|
||||
|
||||
RadioGroupDialog(this, items, currentRowCount) {
|
||||
val newRowCount = it as Int
|
||||
if (currentRowCount != newRowCount) {
|
||||
config.homeRowCount = newRowCount
|
||||
setupHomeRowCount()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupHomeColumnCount() {
|
||||
val currentColumnCount = config.homeColumnCount
|
||||
binding.settingsHomeScreenColumnCount.text = currentColumnCount.toString()
|
||||
binding.settingsHomeScreenColumnCountHolder.setOnClickListener {
|
||||
val items = ArrayList<RadioItem>()
|
||||
for (i in MIN_COLUMN_COUNT..MAX_COLUMN_COUNT) {
|
||||
items.add(RadioItem(i, resources.getQuantityString(com.simplemobiletools.commons.R.plurals.column_counts, i, i)))
|
||||
}
|
||||
|
||||
RadioGroupDialog(this, items, currentColumnCount) {
|
||||
val newColumnCount = it as Int
|
||||
if (currentColumnCount != newColumnCount) {
|
||||
config.homeColumnCount = newColumnCount
|
||||
setupHomeColumnCount()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupLanguage() {
|
||||
settings_language.text = Locale.getDefault().displayLanguage
|
||||
settings_language_holder.beVisibleIf(isTiramisuPlus())
|
||||
settings_language_holder.setOnClickListener {
|
||||
binding.settingsLanguage.text = Locale.getDefault().displayLanguage
|
||||
binding.settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
|
||||
binding.settingsLanguageHolder.setOnClickListener {
|
||||
launchChangeAppLanguageIntent()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupManageHiddenIcons() {
|
||||
settings_manage_hidden_icons_holder.setOnClickListener {
|
||||
binding.settingsManageHiddenIconsHolder.setOnClickListener {
|
||||
startActivity(Intent(this, HiddenIconsActivity::class.java))
|
||||
}
|
||||
}
|
||||
|
@ -100,9 +192,9 @@ class SettingsActivity : SimpleActivity() {
|
|||
val licenses = 0L
|
||||
val faqItems = ArrayList<FAQItem>()
|
||||
|
||||
if (!resources.getBoolean(R.bool.hide_google_relations)) {
|
||||
faqItems.add(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons))
|
||||
faqItems.add(FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons))
|
||||
if (!resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)) {
|
||||
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.commons.R.string.faq_2_text_commons))
|
||||
faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.commons.R.string.faq_6_text_commons))
|
||||
}
|
||||
|
||||
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
package com.simplemobiletools.launcher.adapters
|
||||
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.iterator
|
||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.MainActivity
|
||||
import com.simplemobiletools.launcher.databinding.ItemLauncherLabelBinding
|
||||
import com.simplemobiletools.launcher.extensions.handleGridItemPopupMenu
|
||||
import com.simplemobiletools.launcher.interfaces.ItemMenuListenerAdapter
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
|
||||
class FolderIconsAdapter(
|
||||
activity: BaseSimpleActivity, var items: MutableList<HomeScreenGridItem>, private val iconPadding: Int,
|
||||
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
|
||||
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
|
||||
|
||||
override fun getActionMenuId() = 0
|
||||
|
||||
override fun actionItemPressed(id: Int) {}
|
||||
|
||||
override fun getSelectableItemCount() = itemCount
|
||||
|
||||
override fun getIsItemSelectable(position: Int) = false
|
||||
|
||||
override fun getItemSelectionKey(position: Int) = items.getOrNull(position)?.id?.toInt()
|
||||
|
||||
override fun getItemKeyPosition(key: Int) = items.indexOfFirst { it.id?.toInt() == key }
|
||||
|
||||
override fun onActionModeCreated() {}
|
||||
|
||||
override fun onActionModeDestroyed() {}
|
||||
|
||||
override fun prepareActionMode(menu: Menu) {}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
return createViewHolder(ItemLauncherLabelBinding.inflate(layoutInflater, parent, false).root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val item = items[position]
|
||||
setupView(holder.itemView, item)
|
||||
bindViewHolder(holder)
|
||||
}
|
||||
|
||||
override fun getItemCount() = items.size
|
||||
|
||||
private fun removeItem(item: HomeScreenGridItem) {
|
||||
val position = items.indexOfFirst { it.id == item.id }
|
||||
items.removeAt(position)
|
||||
notifyItemRemoved(position)
|
||||
}
|
||||
|
||||
private fun setupView(view: View, item: HomeScreenGridItem) {
|
||||
ItemLauncherLabelBinding.bind(view).apply {
|
||||
launcherLabel.text = item.title
|
||||
launcherLabel.setTextColor(textColor)
|
||||
launcherIcon.setPadding(iconPadding, iconPadding, iconPadding, 0)
|
||||
launcherIcon.setImageDrawable(item.drawable)
|
||||
|
||||
val mainListener = (activity as? MainActivity)?.menuListener
|
||||
|
||||
root.setOnClickListener { itemClick(item) }
|
||||
root.setOnLongClickListener {
|
||||
popupAnchor.y = launcherIcon.y
|
||||
activity.handleGridItemPopupMenu(popupAnchor, item, false, object : ItemMenuListenerAdapter() {
|
||||
override fun appInfo(gridItem: HomeScreenGridItem) {
|
||||
mainListener?.appInfo(gridItem)
|
||||
}
|
||||
|
||||
override fun remove(gridItem: HomeScreenGridItem) {
|
||||
mainListener?.remove(gridItem)
|
||||
removeItem(gridItem)
|
||||
}
|
||||
|
||||
override fun uninstall(gridItem: HomeScreenGridItem) {
|
||||
mainListener?.uninstall(gridItem)
|
||||
}
|
||||
|
||||
override fun rename(gridItem: HomeScreenGridItem) {
|
||||
mainListener?.rename(gridItem)
|
||||
}
|
||||
|
||||
override fun beforeShow(menu: Menu) {
|
||||
var visibleMenuItems = 0
|
||||
for (menuItem in menu.iterator()) {
|
||||
if (menuItem.isVisible) {
|
||||
visibleMenuItems++
|
||||
}
|
||||
}
|
||||
val yOffset = resources.getDimension(R.dimen.long_press_anchor_button_offset_y) * (visibleMenuItems - 1)
|
||||
popupAnchor.y -= yOffset
|
||||
}
|
||||
})
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateItems(items: List<HomeScreenGridItem>) {
|
||||
this.items.clear()
|
||||
this.items.addAll(items)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
|
@ -15,9 +15,9 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.databinding.ItemHiddenIconBinding
|
||||
import com.simplemobiletools.launcher.extensions.hiddenIconsDB
|
||||
import com.simplemobiletools.launcher.models.HiddenIcon
|
||||
import kotlinx.android.synthetic.main.item_hidden_icon.view.*
|
||||
|
||||
class HiddenIconsAdapter(
|
||||
activity: BaseSimpleActivity,
|
||||
|
@ -56,7 +56,9 @@ class HiddenIconsAdapter(
|
|||
|
||||
override fun onActionModeDestroyed() {}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_hidden_icon, parent)
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
return createViewHolder(ItemHiddenIconBinding.inflate(layoutInflater, parent, false).root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val folder = hiddenIcons[position]
|
||||
|
@ -101,11 +103,11 @@ class HiddenIconsAdapter(
|
|||
}
|
||||
|
||||
private fun setupView(view: View, icon: HiddenIcon) {
|
||||
view.apply {
|
||||
hidden_icon_holder?.isSelected = selectedKeys.contains(icon.hashCode())
|
||||
hidden_icon_label.text = icon.title
|
||||
hidden_icon_label.setTextColor(textColor)
|
||||
hidden_icon.setPadding(iconPadding, iconPadding, iconPadding, 0)
|
||||
ItemHiddenIconBinding.bind(view).apply {
|
||||
hiddenIconHolder.isSelected = selectedKeys.contains(icon.hashCode())
|
||||
hiddenIconLabel.text = icon.title
|
||||
hiddenIconLabel.setTextColor(textColor)
|
||||
hiddenIcon.setPadding(iconPadding, iconPadding, iconPadding, 0)
|
||||
|
||||
val factory = DrawableCrossFadeFactory.Builder(150).setCrossFadeEnabled(true).build()
|
||||
|
||||
|
@ -113,7 +115,7 @@ class HiddenIconsAdapter(
|
|||
.load(icon.drawable)
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.transition(DrawableTransitionOptions.withCrossFade(factory))
|
||||
.into(hidden_icon)
|
||||
.into(hiddenIcon)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.simplemobiletools.launcher.adapters
|
||||
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
@ -7,22 +8,24 @@ import androidx.recyclerview.widget.RecyclerView
|
|||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||
import com.bumptech.glide.request.target.DrawableImageViewTarget
|
||||
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
|
||||
import com.bumptech.glide.request.transition.Transition
|
||||
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
|
||||
import com.simplemobiletools.commons.extensions.getProperTextColor
|
||||
import com.simplemobiletools.commons.extensions.portrait
|
||||
import com.simplemobiletools.commons.extensions.realScreenSize
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.SimpleActivity
|
||||
import com.simplemobiletools.launcher.databinding.ItemLauncherLabelBinding
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import com.simplemobiletools.launcher.interfaces.AllAppsListener
|
||||
import com.simplemobiletools.launcher.models.AppLauncher
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
import kotlinx.android.synthetic.main.item_launcher_label.view.*
|
||||
|
||||
class LaunchersAdapter(
|
||||
val activity: SimpleActivity,
|
||||
var launchers: ArrayList<AppLauncher>,
|
||||
launchers: ArrayList<AppLauncher>,
|
||||
val allAppsListener: AllAppsListener,
|
||||
val itemClick: (Any) -> Unit
|
||||
) : RecyclerView.Adapter<LaunchersAdapter.ViewHolder>(), RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
|
@ -30,30 +33,32 @@ class LaunchersAdapter(
|
|||
private var textColor = activity.getProperTextColor()
|
||||
private var iconPadding = 0
|
||||
private var wereFreshIconsLoaded = false
|
||||
private var filterQuery: String? = null
|
||||
private var filteredLaunchers: List<AppLauncher> = launchers
|
||||
|
||||
var launchers: ArrayList<AppLauncher> = launchers
|
||||
set(value) {
|
||||
field = value
|
||||
updateFilter()
|
||||
}
|
||||
|
||||
init {
|
||||
calculateIconWidth()
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_launcher_label, parent, false)
|
||||
return ViewHolder(view)
|
||||
val binding = ItemLauncherLabelBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
return ViewHolder(binding.root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
holder.bindView(launchers[position])
|
||||
holder.bindView(filteredLaunchers[position])
|
||||
}
|
||||
|
||||
override fun getItemCount() = launchers.size
|
||||
override fun getItemCount() = filteredLaunchers.size
|
||||
|
||||
private fun calculateIconWidth() {
|
||||
val currentColumnCount = activity.resources.getInteger(
|
||||
if (activity.portrait) {
|
||||
R.integer.portrait_column_count
|
||||
} else {
|
||||
R.integer.landscape_column_count
|
||||
}
|
||||
)
|
||||
val currentColumnCount = activity.config.drawerColumnCount
|
||||
|
||||
val iconWidth = activity.realScreenSize.x / currentColumnCount
|
||||
iconPadding = (iconWidth * 0.1f).toInt()
|
||||
|
@ -63,8 +68,10 @@ class LaunchersAdapter(
|
|||
val itemToRemove = launchers.firstOrNull { it.getLauncherIdentifier() == item.getItemIdentifier() }
|
||||
if (itemToRemove != null) {
|
||||
val position = launchers.indexOfFirst { it.getLauncherIdentifier() == item.getItemIdentifier() }
|
||||
val filteredPosition = filteredLaunchers.indexOfFirst { it.getLauncherIdentifier() == item.getItemIdentifier() }
|
||||
launchers.removeAt(position)
|
||||
notifyItemRemoved(position)
|
||||
updateFilter()
|
||||
notifyItemRemoved(filteredPosition)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -78,6 +85,14 @@ class LaunchersAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
fun updateSearchQuery(newQuery: String?) {
|
||||
if (filterQuery != newQuery) {
|
||||
filterQuery = newQuery
|
||||
updateFilter()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
fun updateTextColor(newTextColor: Int) {
|
||||
if (newTextColor != textColor) {
|
||||
textColor = newTextColor
|
||||
|
@ -85,26 +100,44 @@ class LaunchersAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
private fun updateFilter() {
|
||||
filteredLaunchers = launchers.filter { filterQuery == null || it.title.contains(filterQuery!!, ignoreCase = true) }
|
||||
}
|
||||
|
||||
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
fun bindView(launcher: AppLauncher): View {
|
||||
val binding = ItemLauncherLabelBinding.bind(itemView)
|
||||
itemView.apply {
|
||||
launcher_label.text = launcher.title
|
||||
launcher_label.setTextColor(textColor)
|
||||
launcher_icon.setPadding(iconPadding, iconPadding, iconPadding, 0)
|
||||
binding.launcherLabel.text = launcher.title
|
||||
binding.launcherLabel.setTextColor(textColor)
|
||||
binding.launcherIcon.setPadding(iconPadding, iconPadding, iconPadding, 0)
|
||||
|
||||
val factory = DrawableCrossFadeFactory.Builder(150).setCrossFadeEnabled(true).build()
|
||||
val placeholderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.placeholder_drawable, launcher.thumbnailColor)
|
||||
// Once all images are loaded and crossfades are done, directly set drawables
|
||||
if (launcher.drawable != null && binding.launcherIcon.tag == true) {
|
||||
binding.launcherIcon.setImageDrawable(launcher.drawable)
|
||||
} else {
|
||||
val factory = DrawableCrossFadeFactory.Builder(150).setCrossFadeEnabled(true).build()
|
||||
val placeholderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.placeholder_drawable, launcher.thumbnailColor)
|
||||
|
||||
Glide.with(activity)
|
||||
.load(launcher.drawable)
|
||||
.placeholder(placeholderDrawable)
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.transition(DrawableTransitionOptions.withCrossFade(factory))
|
||||
.into(launcher_icon)
|
||||
Glide.with(activity)
|
||||
.load(launcher.drawable)
|
||||
.placeholder(placeholderDrawable)
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.transition(DrawableTransitionOptions.withCrossFade(factory))
|
||||
.into(object : DrawableImageViewTarget(binding.launcherIcon) {
|
||||
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
|
||||
super.onResourceReady(resource, transition)
|
||||
// Set tag to true to mark that crossfade was already done on this view
|
||||
view.tag = true
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
setOnClickListener { itemClick(launcher) }
|
||||
setOnLongClickListener { view ->
|
||||
allAppsListener.onAppLauncherLongPressed(view.x + width / 2, view.y, launcher)
|
||||
val location = IntArray(2)
|
||||
getLocationOnScreen(location)
|
||||
allAppsListener.onAppLauncherLongPressed((location[0] + width / 2).toFloat(), location[1].toFloat(), launcher)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
@ -113,5 +146,5 @@ class LaunchersAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
override fun onChange(position: Int) = launchers.getOrNull(position)?.getBubbleText() ?: ""
|
||||
override fun onChange(position: Int) = filteredLaunchers.getOrNull(position)?.getBubbleText() ?: ""
|
||||
}
|
||||
|
|
|
@ -9,15 +9,15 @@ import com.bumptech.glide.Glide
|
|||
import com.simplemobiletools.commons.extensions.getProperTextColor
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.SimpleActivity
|
||||
import com.simplemobiletools.launcher.databinding.ItemWidgetListItemsHolderBinding
|
||||
import com.simplemobiletools.launcher.databinding.ItemWidgetListSectionBinding
|
||||
import com.simplemobiletools.launcher.databinding.ItemWidgetPreviewBinding
|
||||
import com.simplemobiletools.launcher.helpers.WIDGET_LIST_ITEMS_HOLDER
|
||||
import com.simplemobiletools.launcher.helpers.WIDGET_LIST_SECTION
|
||||
import com.simplemobiletools.launcher.interfaces.WidgetsFragmentListener
|
||||
import com.simplemobiletools.launcher.models.WidgetsListItem
|
||||
import com.simplemobiletools.launcher.models.WidgetsListItemsHolder
|
||||
import com.simplemobiletools.launcher.models.WidgetsListSection
|
||||
import kotlinx.android.synthetic.main.item_widget_list_items_holder.view.*
|
||||
import kotlinx.android.synthetic.main.item_widget_list_section.view.*
|
||||
import kotlinx.android.synthetic.main.item_widget_preview.view.*
|
||||
|
||||
class WidgetsAdapter(
|
||||
val activity: SimpleActivity,
|
||||
|
@ -29,13 +29,13 @@ class WidgetsAdapter(
|
|||
private var textColor = activity.getProperTextColor()
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val layoutId = when (viewType) {
|
||||
WIDGET_LIST_SECTION -> R.layout.item_widget_list_section
|
||||
else -> R.layout.item_widget_list_items_holder
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
val binding = when (viewType) {
|
||||
WIDGET_LIST_SECTION -> ItemWidgetListSectionBinding.inflate(inflater, parent, false)
|
||||
else -> ItemWidgetListItemsHolderBinding.inflate(inflater, parent, false)
|
||||
}
|
||||
|
||||
val view = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
|
||||
return ViewHolder(view)
|
||||
return ViewHolder(binding.root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
|
@ -56,43 +56,44 @@ class WidgetsAdapter(
|
|||
}
|
||||
|
||||
private fun setupListSection(view: View, section: WidgetsListSection) {
|
||||
view.apply {
|
||||
widget_app_title.text = section.appTitle
|
||||
widget_app_title.setTextColor(textColor)
|
||||
widget_app_icon.setImageDrawable(section.appIcon)
|
||||
ItemWidgetListSectionBinding.bind(view).apply {
|
||||
widgetAppTitle.text = section.appTitle
|
||||
widgetAppTitle.setTextColor(textColor)
|
||||
widgetAppIcon.setImageDrawable(section.appIcon)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupListItemsHolder(view: View, listItem: WidgetsListItemsHolder) {
|
||||
view.widget_list_items_holder.removeAllViews()
|
||||
view.widget_list_items_scroll_view.scrollX = 0
|
||||
val binding = ItemWidgetListItemsHolderBinding.bind(view)
|
||||
binding.widgetListItemsHolder.removeAllViews()
|
||||
binding.widgetListItemsScrollView.scrollX = 0
|
||||
listItem.widgets.forEachIndexed { index, widget ->
|
||||
val imageSize = activity.resources.getDimension(R.dimen.widget_preview_size).toInt()
|
||||
val widgetPreview = LayoutInflater.from(activity).inflate(R.layout.item_widget_preview, null)
|
||||
view.widget_list_items_holder.addView(widgetPreview)
|
||||
val widgetPreview = ItemWidgetPreviewBinding.inflate(LayoutInflater.from(activity))
|
||||
binding.widgetListItemsHolder.addView(widgetPreview.root)
|
||||
|
||||
val endMargin = if (index == listItem.widgets.size - 1) {
|
||||
activity.resources.getDimension(R.dimen.medium_margin).toInt()
|
||||
activity.resources.getDimension(com.simplemobiletools.commons.R.dimen.medium_margin).toInt()
|
||||
} else {
|
||||
0
|
||||
}
|
||||
|
||||
widgetPreview.widget_title.apply {
|
||||
widgetPreview.widgetTitle.apply {
|
||||
text = widget.widgetTitle
|
||||
setTextColor(textColor)
|
||||
}
|
||||
|
||||
widgetPreview.widget_size.apply {
|
||||
widgetPreview.widgetSize.apply {
|
||||
text = if (widget.isShortcut) {
|
||||
activity.getString(R.string.shortcut)
|
||||
activity.getString(com.simplemobiletools.commons.R.string.shortcut)
|
||||
} else {
|
||||
"${widget.widthCells} x ${widget.heightCells}"
|
||||
}
|
||||
setTextColor(textColor)
|
||||
}
|
||||
|
||||
(widgetPreview.widget_image.layoutParams as RelativeLayout.LayoutParams).apply {
|
||||
marginStart = activity.resources.getDimension(R.dimen.activity_margin).toInt()
|
||||
(widgetPreview.widgetImage.layoutParams as RelativeLayout.LayoutParams).apply {
|
||||
marginStart = activity.resources.getDimension(com.simplemobiletools.commons.R.dimen.activity_margin).toInt()
|
||||
marginEnd = endMargin
|
||||
width = imageSize
|
||||
height = imageSize
|
||||
|
@ -100,11 +101,11 @@ class WidgetsAdapter(
|
|||
|
||||
Glide.with(activity)
|
||||
.load(widget.widgetPreviewImage)
|
||||
.into(widgetPreview.widget_image)
|
||||
.into(widgetPreview.widgetImage)
|
||||
|
||||
widgetPreview.setOnClickListener { itemClick() }
|
||||
widgetPreview.root.setOnClickListener { itemClick() }
|
||||
|
||||
widgetPreview.setOnLongClickListener { view ->
|
||||
widgetPreview.root.setOnLongClickListener { view ->
|
||||
widgetsFragmentListener.onWidgetLongPressed(widget)
|
||||
true
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ import com.simplemobiletools.launcher.models.AppLauncher
|
|||
import com.simplemobiletools.launcher.models.HiddenIcon
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
|
||||
@Database(entities = [AppLauncher::class, HomeScreenGridItem::class, HiddenIcon::class], version = 4)
|
||||
@Database(entities = [AppLauncher::class, HomeScreenGridItem::class, HiddenIcon::class], version = 5)
|
||||
@TypeConverters(Converters::class)
|
||||
abstract class AppsDatabase : RoomDatabase() {
|
||||
|
||||
|
@ -36,6 +36,7 @@ abstract class AppsDatabase : RoomDatabase() {
|
|||
.addMigrations(MIGRATION_1_2)
|
||||
.addMigrations(MIGRATION_2_3)
|
||||
.addMigrations(MIGRATION_3_4)
|
||||
.addMigrations(MIGRATION_4_5)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
@ -64,5 +65,15 @@ abstract class AppsDatabase : RoomDatabase() {
|
|||
database.execSQL("CREATE UNIQUE INDEX `index_hidden_icons_id` ON `hidden_icons` (`id`)")
|
||||
}
|
||||
}
|
||||
|
||||
private val MIGRATION_4_5 = object : Migration(4, 5) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE `home_screen_grid_items_new` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `left` INTEGER NOT NULL, `top` INTEGER NOT NULL, `right` INTEGER NOT NULL, `bottom` INTEGER NOT NULL, `page` INTEGER NOT NULL, `package_name` TEXT NOT NULL, `activity_name` TEXT NOT NULL, `title` TEXT NOT NULL, `type` INTEGER NOT NULL, `class_name` TEXT NOT NULL, `widget_id` INTEGER NOT NULL, `shortcut_id` TEXT NOT NULL, `icon` BLOB, `docked` INTEGER NOT NULL DEFAULT 0, `parent_id` INTEGER)")
|
||||
database.execSQL("INSERT INTO `home_screen_grid_items_new` (`id`, `left`, `top`, `right`, `bottom`, `page`, `package_name`, `activity_name`, `title`, `type`, `class_name`, `widget_id`, `shortcut_id`, `icon`, `docked`, `parent_id`) SELECT `id`, `left`, `top`, `right`, `bottom`, 0 as `page`, `package_name`, `activity_name`, `title`, `type`, `class_name`, `widget_id`, `shortcut_id`, `icon`, CASE WHEN `type` != 1 AND `top` = 5 THEN 1 ELSE 0 END AS `docked`, NULL AS `parent_id` FROM `home_screen_grid_items` WHERE `intent` IS NULL OR `intent` = ''")
|
||||
database.execSQL("DROP TABLE `home_screen_grid_items`")
|
||||
database.execSQL("ALTER TABLE `home_screen_grid_items_new` RENAME TO `home_screen_grid_items`")
|
||||
database.execSQL("CREATE UNIQUE INDEX `index_home_screen_grid_items_id` ON `home_screen_grid_items` (`id`)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,41 +2,39 @@ package com.simplemobiletools.launcher.dialogs
|
|||
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
import android.view.ViewGroup
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.helpers.mydebug
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.databinding.DialogRenameItemBinding
|
||||
import com.simplemobiletools.launcher.extensions.homeScreenGridItemsDB
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
import kotlinx.android.synthetic.main.dialog_rename_item.view.*
|
||||
|
||||
class RenameItemDialog(val activity: Activity, val item: HomeScreenGridItem, val callback: () -> Unit) {
|
||||
|
||||
init {
|
||||
val view = (activity.layoutInflater.inflate(R.layout.dialog_rename_item, null) as ViewGroup)
|
||||
view.rename_item_edittext.setText(item.title)
|
||||
val binding = DialogRenameItemBinding.inflate(activity.layoutInflater)
|
||||
val view = binding.root
|
||||
binding.renameItemEdittext.setText(item.title)
|
||||
|
||||
activity.getAlertDialogBuilder()
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
|
||||
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
|
||||
.apply {
|
||||
activity.setupDialogStuff(view, this, R.string.rename) { alertDialog ->
|
||||
alertDialog.showKeyboard(view.rename_item_edittext)
|
||||
activity.setupDialogStuff(view, this, com.simplemobiletools.commons.R.string.rename) { alertDialog ->
|
||||
alertDialog.showKeyboard(binding.renameItemEdittext)
|
||||
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
||||
val newTitle = view.rename_item_edittext.value
|
||||
if (!newTitle.isEmpty()) {
|
||||
val newTitle = binding.renameItemEdittext.value
|
||||
if (newTitle.isNotEmpty()) {
|
||||
ensureBackgroundThread {
|
||||
val result = activity.homeScreenGridItemsDB.updateItemTitle(newTitle, item.id!!)
|
||||
if (result == 1) {
|
||||
callback()
|
||||
alertDialog.dismiss()
|
||||
} else {
|
||||
activity.toast(R.string.unknown_error_occurred)
|
||||
activity.toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.value_cannot_be_empty)
|
||||
activity.toast(com.simplemobiletools.commons.R.string.value_cannot_be_empty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,12 +2,37 @@ package com.simplemobiletools.launcher.extensions
|
|||
|
||||
import android.app.Activity
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.pm.LauncherApps
|
||||
import android.content.res.ColorStateList
|
||||
import android.graphics.Rect
|
||||
import android.net.Uri
|
||||
import android.os.Process
|
||||
import android.provider.Settings
|
||||
import android.view.ContextThemeWrapper
|
||||
import android.view.Gravity
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.widget.PopupMenu
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import androidx.core.graphics.drawable.toDrawable
|
||||
import androidx.core.view.MenuCompat
|
||||
import androidx.core.view.forEach
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import com.simplemobiletools.commons.extensions.getPopupMenuTheme
|
||||
import com.simplemobiletools.commons.extensions.getProperTextColor
|
||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||
import com.simplemobiletools.commons.helpers.isQPlus
|
||||
import com.simplemobiletools.commons.helpers.isSPlus
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.SettingsActivity
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_FOLDER
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_WIDGET
|
||||
import com.simplemobiletools.launcher.helpers.UNINSTALL_APP_REQUEST_CODE
|
||||
import com.simplemobiletools.launcher.interfaces.ItemMenuListener
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
|
||||
fun Activity.launchApp(packageName: String, activityName: String) {
|
||||
|
@ -42,6 +67,14 @@ fun Activity.launchAppInfo(packageName: String) {
|
|||
}
|
||||
}
|
||||
|
||||
fun Activity.canAppBeUninstalled(packageName: String): Boolean {
|
||||
return try {
|
||||
(packageManager.getApplicationInfo(packageName, 0).flags and ApplicationInfo.FLAG_SYSTEM) == 0
|
||||
} catch (ignored: Exception) {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun Activity.uninstallApp(packageName: String) {
|
||||
Intent(Intent.ACTION_DELETE).apply {
|
||||
data = Uri.fromParts("package", packageName, null)
|
||||
|
@ -49,12 +82,85 @@ fun Activity.uninstallApp(packageName: String) {
|
|||
}
|
||||
}
|
||||
|
||||
// launch static or dynamic shortcuts that have intents as string
|
||||
fun Activity.launchShortcutIntent(item: HomeScreenGridItem) {
|
||||
try {
|
||||
val intent = Intent.parseUri(item.intent, 0)
|
||||
startActivity(intent)
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
fun Activity.handleGridItemPopupMenu(anchorView: View, gridItem: HomeScreenGridItem, isOnAllAppsFragment: Boolean, listener: ItemMenuListener): PopupMenu {
|
||||
val contextTheme = ContextThemeWrapper(this, getPopupMenuTheme())
|
||||
return PopupMenu(contextTheme, anchorView, Gravity.TOP or Gravity.END).apply {
|
||||
if (isQPlus()) {
|
||||
setForceShowIcon(true)
|
||||
}
|
||||
|
||||
inflate(R.menu.menu_app_icon)
|
||||
menu.forEach {
|
||||
val default = getProperTextColor()
|
||||
val color = if (isSPlus() && config.isUsingSystemTheme) {
|
||||
default
|
||||
} else {
|
||||
MaterialColors.getColor(contextTheme, android.R.attr.actionMenuTextColor, default)
|
||||
}
|
||||
it.iconTintList = ColorStateList.valueOf(color)
|
||||
}
|
||||
menu.findItem(R.id.rename).isVisible = (gridItem.type == ITEM_TYPE_ICON || gridItem.type == ITEM_TYPE_FOLDER) && !isOnAllAppsFragment
|
||||
menu.findItem(R.id.hide_icon).isVisible = gridItem.type == ITEM_TYPE_ICON && isOnAllAppsFragment
|
||||
menu.findItem(R.id.resize).isVisible = gridItem.type == ITEM_TYPE_WIDGET
|
||||
menu.findItem(R.id.app_info).isVisible = gridItem.type == ITEM_TYPE_ICON
|
||||
menu.findItem(R.id.uninstall).isVisible = gridItem.type == ITEM_TYPE_ICON && canAppBeUninstalled(gridItem.packageName)
|
||||
menu.findItem(R.id.remove).isVisible = !isOnAllAppsFragment
|
||||
|
||||
val launcherApps = applicationContext.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
|
||||
val shortcuts = if (launcherApps.hasShortcutHostPermission()) {
|
||||
try {
|
||||
val query = LauncherApps.ShortcutQuery().setQueryFlags(
|
||||
LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC or LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST or LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED
|
||||
).setPackage(gridItem.packageName)
|
||||
launcherApps.getShortcuts(query, Process.myUserHandle())
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
val hasShortcuts = !shortcuts.isNullOrEmpty()
|
||||
MenuCompat.setGroupDividerEnabled(menu, hasShortcuts)
|
||||
menu.setGroupVisible(R.id.group_shortcuts, hasShortcuts)
|
||||
if (hasShortcuts) {
|
||||
val iconSize = resources.getDimensionPixelSize(R.dimen.menu_icon_size)
|
||||
shortcuts?.forEach {
|
||||
menu.add(R.id.group_shortcuts, Menu.NONE, Menu.NONE, it.getLabel())
|
||||
.setIcon(
|
||||
launcherApps.getShortcutIconDrawable(it, resources.displayMetrics.densityDpi).toBitmap(width = iconSize, height = iconSize)
|
||||
.toDrawable(resources)
|
||||
)
|
||||
.setOnMenuItemClickListener { _ ->
|
||||
listener.onAnyClick()
|
||||
val id = it.id
|
||||
val packageName = it.`package`
|
||||
val userHandle = Process.myUserHandle()
|
||||
launcherApps.startShortcut(packageName, id, Rect(), null, userHandle)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setOnMenuItemClickListener { item ->
|
||||
listener.onAnyClick()
|
||||
when (item.itemId) {
|
||||
R.id.hide_icon -> listener.hide(gridItem)
|
||||
R.id.rename -> listener.rename(gridItem)
|
||||
R.id.resize -> listener.resize(gridItem)
|
||||
R.id.app_info -> listener.appInfo(gridItem)
|
||||
R.id.remove -> listener.remove(gridItem)
|
||||
R.id.uninstall -> listener.uninstall(gridItem)
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
setOnDismissListener {
|
||||
listener.onDismiss()
|
||||
}
|
||||
|
||||
listener.beforeShow(menu)
|
||||
|
||||
show()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ import android.content.pm.LauncherApps
|
|||
import android.graphics.drawable.Drawable
|
||||
import android.os.Process
|
||||
import android.util.Size
|
||||
import com.simplemobiletools.commons.extensions.portrait
|
||||
import com.simplemobiletools.commons.helpers.isSPlus
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.databases.AppsDatabase
|
||||
import com.simplemobiletools.launcher.helpers.Config
|
||||
import com.simplemobiletools.launcher.interfaces.AppLaunchersDao
|
||||
|
@ -23,14 +21,6 @@ val Context.homeScreenGridItemsDB: HomeScreenGridItemsDao get() = AppsDatabase.g
|
|||
|
||||
val Context.hiddenIconsDB: HiddenIconsDao get() = AppsDatabase.getInstance(applicationContext).HiddenIconsDao()
|
||||
|
||||
fun Context.getColumnCount(): Int {
|
||||
return if (portrait) {
|
||||
resources.getInteger(R.integer.portrait_column_count)
|
||||
} else {
|
||||
resources.getInteger(R.integer.landscape_column_count)
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.getDrawableForPackageName(packageName: String): Drawable? {
|
||||
var drawable: Drawable? = null
|
||||
try {
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package com.simplemobiletools.launcher.extensions
|
||||
|
||||
import android.content.pm.ShortcutInfo
|
||||
|
||||
fun ShortcutInfo?.getLabel() = this?.longLabel?.toString().ifNullOrEmpty { this?.shortLabel?.toString() } ?: ""
|
||||
|
||||
private fun String?.ifNullOrEmpty(block: () -> String?) = this?.ifEmpty { block() } ?: block()
|
|
@ -10,18 +10,17 @@ import android.view.WindowManager
|
|||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.isRPlus
|
||||
import com.simplemobiletools.commons.views.MyGridLayoutManager
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.MainActivity
|
||||
import com.simplemobiletools.launcher.adapters.LaunchersAdapter
|
||||
import com.simplemobiletools.launcher.extensions.getColumnCount
|
||||
import com.simplemobiletools.launcher.databinding.AllAppsFragmentBinding
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import com.simplemobiletools.launcher.extensions.launchApp
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON
|
||||
import com.simplemobiletools.launcher.interfaces.AllAppsListener
|
||||
import com.simplemobiletools.launcher.models.AppLauncher
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
import kotlinx.android.synthetic.main.all_apps_fragment.view.*
|
||||
|
||||
class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment(context, attributeSet), AllAppsListener {
|
||||
class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment<AllAppsFragmentBinding>(context, attributeSet), AllAppsListener {
|
||||
private var lastTouchCoords = Pair(0f, 0f)
|
||||
var touchDownY = -1
|
||||
var ignoreTouches = false
|
||||
|
@ -30,8 +29,9 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun setupFragment(activity: MainActivity) {
|
||||
this.activity = activity
|
||||
this.binding = AllAppsFragmentBinding.bind(this)
|
||||
|
||||
all_apps_grid.setOnTouchListener { v, event ->
|
||||
binding.allAppsGrid.setOnTouchListener { v, event ->
|
||||
if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_CANCEL) {
|
||||
touchDownY = -1
|
||||
}
|
||||
|
@ -40,18 +40,28 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
}
|
||||
|
||||
fun onConfigurationChanged() {
|
||||
if (all_apps_grid == null) {
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun onResume() {
|
||||
if (binding.allAppsGrid.layoutManager == null || binding.allAppsGrid.adapter == null) {
|
||||
return
|
||||
}
|
||||
|
||||
all_apps_grid.scrollToPosition(0)
|
||||
all_apps_fastscroller.resetManualScrolling()
|
||||
val layoutManager = binding.allAppsGrid.layoutManager as MyGridLayoutManager
|
||||
if (layoutManager.spanCount != context.config.drawerColumnCount) {
|
||||
onConfigurationChanged()
|
||||
// Force redraw due to changed item size
|
||||
(binding.allAppsGrid.adapter as LaunchersAdapter).notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
fun onConfigurationChanged() {
|
||||
binding.allAppsGrid.scrollToPosition(0)
|
||||
binding.allAppsFastscroller.resetManualScrolling()
|
||||
setupViews()
|
||||
|
||||
val layoutManager = all_apps_grid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = context.getColumnCount()
|
||||
val launchers = (all_apps_grid.adapter as LaunchersAdapter).launchers
|
||||
val layoutManager = binding.allAppsGrid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = context.config.drawerColumnCount
|
||||
val launchers = (binding.allAppsGrid.adapter as LaunchersAdapter).launchers
|
||||
setupAdapter(launchers)
|
||||
}
|
||||
|
||||
|
@ -73,7 +83,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
|
||||
// pull the whole fragment down if it is scrolled way to the top and the users pulls it even further
|
||||
if (touchDownY != -1) {
|
||||
shouldIntercept = touchDownY - event.y.toInt() < 0 && all_apps_grid.computeVerticalScrollOffset() == 0
|
||||
shouldIntercept = touchDownY - event.y.toInt() < 0 && binding.allAppsGrid.computeVerticalScrollOffset() == 0
|
||||
if (shouldIntercept) {
|
||||
activity?.startHandlingTouches(touchDownY)
|
||||
touchDownY = -1
|
||||
|
@ -99,17 +109,20 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
|
||||
private fun setupAdapter(launchers: ArrayList<AppLauncher>) {
|
||||
activity?.runOnUiThread {
|
||||
val layoutManager = all_apps_grid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = context.getColumnCount()
|
||||
val layoutManager = binding.allAppsGrid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = context.config.drawerColumnCount
|
||||
|
||||
val currAdapter = all_apps_grid.adapter
|
||||
val currAdapter = binding.allAppsGrid.adapter
|
||||
if (currAdapter == null) {
|
||||
LaunchersAdapter(activity!!, launchers, this) {
|
||||
activity?.launchApp((it as AppLauncher).packageName, it.activityName)
|
||||
if (activity?.config?.closeAppDrawer == true) {
|
||||
activity?.closeAppDrawer(delayed = true)
|
||||
}
|
||||
ignoreTouches = false
|
||||
touchDownY = -1
|
||||
}.apply {
|
||||
all_apps_grid.adapter = this
|
||||
binding.allAppsGrid.adapter = this
|
||||
}
|
||||
} else {
|
||||
(currAdapter as LaunchersAdapter).updateItems(launchers)
|
||||
|
@ -118,7 +131,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
|
||||
fun hideIcon(item: HomeScreenGridItem) {
|
||||
(all_apps_grid.adapter as? LaunchersAdapter)?.hideIcon(item)
|
||||
(binding.allAppsGrid.adapter as? LaunchersAdapter)?.hideIcon(item)
|
||||
}
|
||||
|
||||
fun setupViews(addTopPadding: Boolean = hasTopPadding) {
|
||||
|
@ -126,7 +139,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
return
|
||||
}
|
||||
|
||||
all_apps_fastscroller.updateColors(context.getProperPrimaryColor())
|
||||
binding.allAppsFastscroller.updateColors(context.getProperPrimaryColor())
|
||||
|
||||
var bottomListPadding = 0
|
||||
var leftListPadding = 0
|
||||
|
@ -152,14 +165,29 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
}
|
||||
|
||||
all_apps_grid.setPadding(0, 0, resources.getDimension(R.dimen.medium_margin).toInt(), bottomListPadding)
|
||||
all_apps_fastscroller.setPadding(leftListPadding, 0, rightListPadding, 0)
|
||||
binding.allAppsGrid.setPadding(0, 0, resources.getDimension(com.simplemobiletools.commons.R.dimen.medium_margin).toInt(), bottomListPadding)
|
||||
binding.allAppsFastscroller.setPadding(leftListPadding, 0, rightListPadding, 0)
|
||||
|
||||
hasTopPadding = addTopPadding
|
||||
val topPadding = if (addTopPadding) activity!!.statusBarHeight else 0
|
||||
setPadding(0, topPadding, 0, 0)
|
||||
background = ColorDrawable(context.getProperBackgroundColor())
|
||||
(all_apps_grid.adapter as? LaunchersAdapter)?.updateTextColor(context.getProperTextColor())
|
||||
(binding.allAppsGrid.adapter as? LaunchersAdapter)?.updateTextColor(context.getProperTextColor())
|
||||
|
||||
binding.searchBar.beVisibleIf(context.config.showSearchBar)
|
||||
binding.searchBar.getToolbar()?.beGone()
|
||||
binding.searchBar.updateColors()
|
||||
binding.searchBar.setupMenu()
|
||||
|
||||
binding.searchBar.onSearchTextChangedListener = {
|
||||
(binding.allAppsGrid.adapter as? LaunchersAdapter)?.updateSearchQuery(it)
|
||||
showNoResultsPlaceholderIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
private fun showNoResultsPlaceholderIfNeeded() {
|
||||
val itemCount = binding.allAppsGrid.adapter?.itemCount
|
||||
binding.noResultsPlaceholder.beVisibleIf(itemCount != null && itemCount == 0)
|
||||
}
|
||||
|
||||
override fun onAppLauncherLongPressed(x: Float, y: Float, appLauncher: AppLauncher) {
|
||||
|
@ -169,6 +197,7 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
-1,
|
||||
-1,
|
||||
-1,
|
||||
0,
|
||||
appLauncher.packageName,
|
||||
appLauncher.activityName,
|
||||
appLauncher.title,
|
||||
|
@ -176,12 +205,24 @@ class AllAppsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
"",
|
||||
-1,
|
||||
"",
|
||||
"",
|
||||
null,
|
||||
false,
|
||||
null,
|
||||
appLauncher.drawable
|
||||
)
|
||||
|
||||
activity?.showHomeIconMenu(x, y, gridItem, true)
|
||||
ignoreTouches = true
|
||||
|
||||
binding.searchBar.closeSearch()
|
||||
}
|
||||
|
||||
fun onBackPressed(): Boolean {
|
||||
if (binding.searchBar.isSearchOpen) {
|
||||
binding.searchBar.closeSearch()
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,10 +3,12 @@ package com.simplemobiletools.launcher.fragments
|
|||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.simplemobiletools.launcher.activities.MainActivity
|
||||
|
||||
abstract class MyFragment(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) {
|
||||
abstract class MyFragment<BINDING : ViewBinding>(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) {
|
||||
protected var activity: MainActivity? = null
|
||||
protected lateinit var binding: BINDING
|
||||
|
||||
abstract fun setupFragment(activity: MainActivity)
|
||||
}
|
||||
|
|
|
@ -18,14 +18,15 @@ import com.simplemobiletools.commons.helpers.isRPlus
|
|||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.activities.MainActivity
|
||||
import com.simplemobiletools.launcher.adapters.WidgetsAdapter
|
||||
import com.simplemobiletools.launcher.databinding.WidgetsFragmentBinding
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import com.simplemobiletools.launcher.extensions.getInitialCellSize
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_SHORTCUT
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_WIDGET
|
||||
import com.simplemobiletools.launcher.interfaces.WidgetsFragmentListener
|
||||
import com.simplemobiletools.launcher.models.*
|
||||
import kotlinx.android.synthetic.main.widgets_fragment.view.*
|
||||
|
||||
class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment(context, attributeSet), WidgetsFragmentListener {
|
||||
class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment<WidgetsFragmentBinding>(context, attributeSet), WidgetsFragmentListener {
|
||||
private var lastTouchCoords = Pair(0f, 0f)
|
||||
var touchDownY = -1
|
||||
var ignoreTouches = false
|
||||
|
@ -34,9 +35,10 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun setupFragment(activity: MainActivity) {
|
||||
this.activity = activity
|
||||
this.binding = WidgetsFragmentBinding.bind(this)
|
||||
getAppWidgets()
|
||||
|
||||
widgets_list.setOnTouchListener { v, event ->
|
||||
binding.widgetsList.setOnTouchListener { v, event ->
|
||||
if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_CANCEL) {
|
||||
touchDownY = -1
|
||||
}
|
||||
|
@ -46,15 +48,19 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
|
||||
fun onConfigurationChanged() {
|
||||
if (widgets_list == null) {
|
||||
if (binding.widgetsList == null) {
|
||||
return
|
||||
}
|
||||
|
||||
widgets_list.scrollToPosition(0)
|
||||
binding.widgetsList.scrollToPosition(0)
|
||||
setupViews()
|
||||
|
||||
val appWidgets = (widgets_list.adapter as WidgetsAdapter).widgetListItems
|
||||
setupAdapter(appWidgets)
|
||||
val appWidgets = (binding.widgetsList.adapter as? WidgetsAdapter)?.widgetListItems
|
||||
if (appWidgets != null) {
|
||||
setupAdapter(appWidgets)
|
||||
} else {
|
||||
getAppWidgets()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
|
||||
|
@ -75,7 +81,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
|
||||
// pull the whole fragment down if it is scrolled way to the top and the users pulls it even further
|
||||
if (touchDownY != -1) {
|
||||
shouldIntercept = touchDownY - event.y.toInt() < 0 && widgets_list.computeVerticalScrollOffset() == 0
|
||||
shouldIntercept = touchDownY - event.y.toInt() < 0 && binding.widgetsList.computeVerticalScrollOffset() == 0
|
||||
if (shouldIntercept) {
|
||||
activity?.startHandlingTouches(touchDownY)
|
||||
touchDownY = -1
|
||||
|
@ -158,14 +164,14 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
|
||||
private fun setupAdapter(widgetsListItems: ArrayList<WidgetsListItem>) {
|
||||
activity?.runOnUiThread {
|
||||
val currAdapter = widgets_list.adapter
|
||||
val currAdapter = binding.widgetsList.adapter
|
||||
if (currAdapter == null) {
|
||||
WidgetsAdapter(activity!!, widgetsListItems, this) {
|
||||
context.toast(R.string.touch_hold_widget)
|
||||
ignoreTouches = false
|
||||
touchDownY = -1
|
||||
}.apply {
|
||||
widgets_list.adapter = this
|
||||
binding.widgetsList.adapter = this
|
||||
}
|
||||
} else {
|
||||
(currAdapter as WidgetsAdapter).updateItems(widgetsListItems)
|
||||
|
@ -178,7 +184,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
return
|
||||
}
|
||||
|
||||
widgets_fastscroller.updateColors(context.getProperPrimaryColor())
|
||||
binding.widgetsFastscroller.updateColors(context.getProperPrimaryColor())
|
||||
|
||||
var bottomListPadding = 0
|
||||
var leftListPadding = 0
|
||||
|
@ -204,14 +210,14 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
}
|
||||
|
||||
widgets_list.setPadding(0, 0, 0, bottomListPadding)
|
||||
widgets_fastscroller.setPadding(leftListPadding, 0, rightListPadding, 0)
|
||||
binding.widgetsList.setPadding(0, 0, 0, bottomListPadding)
|
||||
binding.widgetsFastscroller.setPadding(leftListPadding, 0, rightListPadding, 0)
|
||||
|
||||
hasTopPadding = addTopPadding
|
||||
val topPadding = if (addTopPadding) activity!!.statusBarHeight else 0
|
||||
setPadding(0, topPadding, 0, 0)
|
||||
background = ColorDrawable(context.getProperBackgroundColor())
|
||||
(widgets_list.adapter as? WidgetsAdapter)?.updateTextColor(context.getProperTextColor())
|
||||
(binding.widgetsList.adapter as? WidgetsAdapter)?.updateTextColor(context.getProperTextColor())
|
||||
}
|
||||
|
||||
private fun getAppMetadataFromPackage(packageName: String): WidgetsListSection? {
|
||||
|
@ -238,6 +244,11 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
}
|
||||
|
||||
override fun onWidgetLongPressed(appWidget: AppWidget) {
|
||||
if (appWidget.heightCells > context.config.homeRowCount - 1 || appWidget.widthCells > context.config.homeColumnCount) {
|
||||
context.showErrorToast(context.getString(R.string.widget_too_big))
|
||||
return
|
||||
}
|
||||
|
||||
val type = if (appWidget.isShortcut) {
|
||||
ITEM_TYPE_SHORTCUT
|
||||
} else {
|
||||
|
@ -250,6 +261,7 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
-1,
|
||||
-1,
|
||||
-1,
|
||||
0,
|
||||
appWidget.appPackageName,
|
||||
"",
|
||||
"",
|
||||
|
@ -257,7 +269,8 @@ class WidgetsFragment(context: Context, attributeSet: AttributeSet) : MyFragment
|
|||
appWidget.className,
|
||||
-1,
|
||||
"",
|
||||
"",
|
||||
null,
|
||||
false,
|
||||
null,
|
||||
appWidget.widgetPreviewImage,
|
||||
appWidget.providerInfo,
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simplemobiletools.launcher.helpers
|
|||
|
||||
import android.content.Context
|
||||
import com.simplemobiletools.commons.helpers.BaseConfig
|
||||
import com.simplemobiletools.launcher.R
|
||||
|
||||
class Config(context: Context) : BaseConfig(context) {
|
||||
companion object {
|
||||
|
@ -11,4 +12,24 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
var wasHomeScreenInit: Boolean
|
||||
get() = prefs.getBoolean(WAS_HOME_SCREEN_INIT, false)
|
||||
set(wasHomeScreenInit) = prefs.edit().putBoolean(WAS_HOME_SCREEN_INIT, wasHomeScreenInit).apply()
|
||||
|
||||
var homeColumnCount: Int
|
||||
get() = prefs.getInt(HOME_COLUMN_COUNT, COLUMN_COUNT)
|
||||
set(homeColumnCount) = prefs.edit().putInt(HOME_COLUMN_COUNT, homeColumnCount).apply()
|
||||
|
||||
var homeRowCount: Int
|
||||
get() = prefs.getInt(HOME_ROW_COUNT, ROW_COUNT)
|
||||
set(homeRowCount) = prefs.edit().putInt(HOME_ROW_COUNT, homeRowCount).apply()
|
||||
|
||||
var drawerColumnCount: Int
|
||||
get() = prefs.getInt(DRAWER_COLUMN_COUNT, context.resources.getInteger(R.integer.portrait_column_count))
|
||||
set(drawerColumnCount) = prefs.edit().putInt(DRAWER_COLUMN_COUNT, drawerColumnCount).apply()
|
||||
|
||||
var showSearchBar: Boolean
|
||||
get() = prefs.getBoolean(SHOW_SEARCH_BAR, true)
|
||||
set(showSearchBar) = prefs.edit().putBoolean(SHOW_SEARCH_BAR, showSearchBar).apply()
|
||||
|
||||
var closeAppDrawer: Boolean
|
||||
get() = prefs.getBoolean(CLOSE_APP_DRAWER, false)
|
||||
set(closeAppDrawer) = prefs.edit().putBoolean(CLOSE_APP_DRAWER, closeAppDrawer).apply()
|
||||
}
|
||||
|
|
|
@ -5,10 +5,19 @@ const val WIDGET_LIST_ITEMS_HOLDER = 1
|
|||
|
||||
// shared prefs
|
||||
const val WAS_HOME_SCREEN_INIT = "was_home_screen_init"
|
||||
const val HOME_ROW_COUNT = "home_row_count"
|
||||
const val HOME_COLUMN_COUNT = "home_column_count"
|
||||
const val DRAWER_COLUMN_COUNT = "drawer_column_count"
|
||||
const val SHOW_SEARCH_BAR = "show_search_bar"
|
||||
const val CLOSE_APP_DRAWER = "close_app_drawer"
|
||||
|
||||
// default home screen grid size
|
||||
const val ROW_COUNT = 6
|
||||
const val COLUMN_COUNT = 5
|
||||
const val MIN_ROW_COUNT = 2
|
||||
const val MAX_ROW_COUNT = 15
|
||||
const val MIN_COLUMN_COUNT = 2
|
||||
const val MAX_COLUMN_COUNT = 15
|
||||
|
||||
const val UNINSTALL_APP_REQUEST_CODE = 50
|
||||
const val REQUEST_CONFIGURE_WIDGET = 51
|
||||
|
@ -18,6 +27,7 @@ const val REQUEST_CREATE_SHORTCUT = 53
|
|||
const val ITEM_TYPE_ICON = 0
|
||||
const val ITEM_TYPE_WIDGET = 1
|
||||
const val ITEM_TYPE_SHORTCUT = 2
|
||||
const val ITEM_TYPE_FOLDER = 3
|
||||
|
||||
const val WIDGET_HOST_ID = 12345
|
||||
const val MAX_CLICK_DURATION = 150
|
||||
|
|
|
@ -4,4 +4,8 @@ interface FlingListener {
|
|||
fun onFlingUp()
|
||||
|
||||
fun onFlingDown()
|
||||
|
||||
fun onFlingRight()
|
||||
|
||||
fun onFlingLeft()
|
||||
}
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package com.simplemobiletools.launcher.interfaces
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import androidx.room.*
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
|
||||
@Dao
|
||||
|
@ -11,6 +8,9 @@ interface HomeScreenGridItemsDao {
|
|||
@Query("SELECT * FROM home_screen_grid_items")
|
||||
fun getAllItems(): List<HomeScreenGridItem>
|
||||
|
||||
@Query("SELECT * FROM home_screen_grid_items WHERE parent_id = :folderId")
|
||||
fun getFolderItems(folderId: Long): List<HomeScreenGridItem>
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun insert(item: HomeScreenGridItem): Long
|
||||
|
||||
|
@ -23,12 +23,36 @@ interface HomeScreenGridItemsDao {
|
|||
@Query("UPDATE home_screen_grid_items SET title = :title WHERE id = :id")
|
||||
fun updateItemTitle(title: String, id: Long): Int
|
||||
|
||||
@Query("UPDATE home_screen_grid_items SET `left` = :left, `top` = :top, `right` = :right, `bottom` = :bottom WHERE id = :id")
|
||||
fun updateItemPosition(left: Int, top: Int, right: Int, bottom: Int, id: Long)
|
||||
@Query("UPDATE home_screen_grid_items SET `left` = :left, `top` = :top, `right` = :right, `bottom` = :bottom, `page` = :page, `docked` = :docked , `parent_id` = :parentId WHERE id = :id")
|
||||
fun updateItemPosition(left: Int, top: Int, right: Int, bottom: Int, page: Int, docked: Boolean, parentId: Long?, id: Long)
|
||||
|
||||
@Query("DELETE FROM home_screen_grid_items WHERE id = :id")
|
||||
fun deleteById(id: Long)
|
||||
fun deleteItemById(id: Long)
|
||||
|
||||
@Query("DELETE FROM home_screen_grid_items WHERE parent_id = :id")
|
||||
fun deleteItemsWithParentId(id: Long)
|
||||
|
||||
@Transaction
|
||||
fun deleteById(id: Long) {
|
||||
deleteItemById(id)
|
||||
deleteItemsWithParentId(id)
|
||||
}
|
||||
|
||||
@Query("DELETE FROM home_screen_grid_items WHERE package_name = :packageName")
|
||||
fun deleteByPackageName(packageName: String)
|
||||
fun deleteItemByPackageName(packageName: String)
|
||||
|
||||
@Query("DELETE FROM home_screen_grid_items WHERE parent_id IN (SELECT id FROM home_screen_grid_items WHERE package_name = :packageName)")
|
||||
fun deleteItemsByParentPackageName(packageName: String)
|
||||
|
||||
@Query("UPDATE home_screen_grid_items SET `left` = `left` + :shiftBy WHERE parent_id == :folderId AND `left` > :shiftFrom AND id != :excludingId")
|
||||
fun shiftFolderItems(folderId: Long, shiftFrom: Int, shiftBy: Int, excludingId: Long? = null)
|
||||
|
||||
@Query("UPDATE home_screen_grid_items SET `page` = `page` + :shiftBy WHERE `page` > :shiftFrom")
|
||||
fun shiftPage(shiftFrom: Int, shiftBy: Int)
|
||||
|
||||
@Transaction
|
||||
fun deleteByPackageName(packageName: String) {
|
||||
deleteItemByPackageName(packageName)
|
||||
deleteItemsByParentPackageName(packageName)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package com.simplemobiletools.launcher.interfaces
|
||||
|
||||
import android.view.Menu
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
|
||||
interface ItemMenuListener {
|
||||
fun onAnyClick()
|
||||
fun hide(gridItem: HomeScreenGridItem)
|
||||
fun rename(gridItem: HomeScreenGridItem)
|
||||
fun resize(gridItem: HomeScreenGridItem)
|
||||
fun appInfo(gridItem: HomeScreenGridItem)
|
||||
fun remove(gridItem: HomeScreenGridItem)
|
||||
fun uninstall(gridItem: HomeScreenGridItem)
|
||||
fun onDismiss()
|
||||
fun beforeShow(menu: Menu)
|
||||
}
|
||||
|
||||
abstract class ItemMenuListenerAdapter : ItemMenuListener {
|
||||
override fun onAnyClick() = Unit
|
||||
override fun hide(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun rename(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun resize(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun appInfo(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun remove(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun uninstall(gridItem: HomeScreenGridItem) = Unit
|
||||
override fun onDismiss() = Unit
|
||||
override fun beforeShow(menu: Menu) = Unit
|
||||
}
|
|
@ -3,6 +3,7 @@ package com.simplemobiletools.launcher.models
|
|||
import android.appwidget.AppWidgetProviderInfo
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Point
|
||||
import android.graphics.drawable.Drawable
|
||||
import androidx.room.*
|
||||
import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON
|
||||
|
@ -15,15 +16,17 @@ data class HomeScreenGridItem(
|
|||
@ColumnInfo(name = "top") var top: Int,
|
||||
@ColumnInfo(name = "right") var right: Int,
|
||||
@ColumnInfo(name = "bottom") var bottom: Int,
|
||||
@ColumnInfo(name = "page") var page: Int,
|
||||
@ColumnInfo(name = "package_name") var packageName: String,
|
||||
@ColumnInfo(name = "activity_name") var activityName: String, // needed at apps that create multiple icons at install, not just the launcher
|
||||
@ColumnInfo(name = "title") var title: String,
|
||||
@ColumnInfo(name = "type") var type: Int,
|
||||
@ColumnInfo(name = "class_name") var className: String,
|
||||
@ColumnInfo(name = "widget_id") var widgetId: Int,
|
||||
@ColumnInfo(name = "intent") var intent: String, // used at static and dynamic shortcuts on click
|
||||
@ColumnInfo(name = "shortcut_id") var shortcutId: String, // used at pinned shortcuts at startLauncher call
|
||||
@ColumnInfo(name = "icon") var icon: Bitmap? = null, // store images of pinned shortcuts, those cannot be retrieved after creating
|
||||
@ColumnInfo(name = "docked") var docked: Boolean = false, // special flag, meaning that page, top and bottom don't matter for this item, it is always at the bottom of the screen
|
||||
@ColumnInfo(name = "parent_id") var parentId: Long? = null, // id of folder this item is in (if it is in any)
|
||||
|
||||
@Ignore var drawable: Drawable? = null,
|
||||
@Ignore var providerInfo: AppWidgetProviderInfo? = null, // used at widgets
|
||||
|
@ -31,7 +34,11 @@ data class HomeScreenGridItem(
|
|||
@Ignore var widthCells: Int = 1,
|
||||
@Ignore var heightCells: Int = 1
|
||||
) {
|
||||
constructor() : this(null, -1, -1, -1, -1, "", "", "", ITEM_TYPE_ICON, "", -1, "", "", null, null, null, null, 1, 1)
|
||||
companion object {
|
||||
const val FOLDER_MAX_CAPACITY = 16
|
||||
}
|
||||
|
||||
constructor() : this(null, -1, -1, -1, -1, 0, "", "", "", ITEM_TYPE_ICON, "", -1, "", null, false, null, null, null, null, 1, 1)
|
||||
|
||||
fun getWidthInCells() = if (right == -1 || left == -1) {
|
||||
widthCells
|
||||
|
@ -45,5 +52,23 @@ data class HomeScreenGridItem(
|
|||
bottom - top + 1
|
||||
}
|
||||
|
||||
fun getDockAdjustedTop(rowCount: Int): Int {
|
||||
return if (!docked) {
|
||||
top
|
||||
} else {
|
||||
rowCount - 1
|
||||
}
|
||||
}
|
||||
|
||||
fun getDockAdjustedBottom(rowCount: Int): Int {
|
||||
return if (!docked) {
|
||||
bottom
|
||||
} else {
|
||||
rowCount - 1
|
||||
}
|
||||
}
|
||||
|
||||
fun getItemIdentifier() = "$packageName/$activityName"
|
||||
|
||||
fun getTopLeft(rowCount: Int) = Point(left, getDockAdjustedTop(rowCount))
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
package com.simplemobiletools.launcher.views
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
|
||||
class HomeScreenGridDrawingArea @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||
) : View(context, attrs, defStyleAttr) {
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
(parent as HomeScreenGrid).drawInto(canvas)
|
||||
}
|
||||
}
|
|
@ -7,13 +7,14 @@ import android.os.Handler
|
|||
import android.view.MotionEvent
|
||||
import android.view.ViewConfiguration
|
||||
import com.simplemobiletools.launcher.R
|
||||
import kotlin.math.abs
|
||||
|
||||
class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
||||
private var longPressHandler = Handler()
|
||||
private var actionDownCoords = PointF()
|
||||
private var currentCoords = PointF()
|
||||
private var actionDownMS = 0L
|
||||
private val moveGestureThreshold = resources.getDimension(R.dimen.move_gesture_threshold).toInt()
|
||||
private val moveGestureThreshold = resources.getDimension(R.dimen.move_gesture_threshold).toInt() / 4
|
||||
var hasLongPressed = false
|
||||
var ignoreTouches = false
|
||||
var longPressListener: ((x: Float, y: Float) -> Unit)? = null
|
||||
|
@ -47,12 +48,18 @@ class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
|||
currentCoords.y = event.rawY
|
||||
actionDownMS = System.currentTimeMillis()
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
currentCoords.x = event.rawX
|
||||
currentCoords.y = event.rawY
|
||||
if (abs(actionDownCoords.x - currentCoords.x) > moveGestureThreshold ) {
|
||||
resetTouches()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
longPressHandler.removeCallbacksAndMessages(null)
|
||||
resetTouches()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,10 +67,17 @@ class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) {
|
|||
}
|
||||
|
||||
private val longPressRunnable = Runnable {
|
||||
if (Math.abs(actionDownCoords.x - currentCoords.x) < moveGestureThreshold && Math.abs(actionDownCoords.y - currentCoords.y) < moveGestureThreshold) {
|
||||
if (abs(actionDownCoords.x - currentCoords.x) < moveGestureThreshold && abs(actionDownCoords.y - currentCoords.y) < moveGestureThreshold) {
|
||||
longPressHandler.removeCallbacksAndMessages(null)
|
||||
hasLongPressed = true
|
||||
longPressListener?.invoke(actionDownCoords.x, actionDownCoords.y)
|
||||
}
|
||||
}
|
||||
|
||||
fun resetTouches() {
|
||||
longPressHandler.removeCallbacksAndMessages(null)
|
||||
}
|
||||
|
||||
private fun hasFingerMoved(x: Float, y: Float) =
|
||||
((abs(actionDownCoords.x - x) > moveGestureThreshold) || (abs(actionDownCoords.y - y) > moveGestureThreshold))
|
||||
}
|
||||
|
|
|
@ -9,11 +9,11 @@ import android.util.AttributeSet
|
|||
import android.view.MotionEvent
|
||||
import android.widget.RelativeLayout
|
||||
import com.simplemobiletools.launcher.R
|
||||
import com.simplemobiletools.launcher.extensions.config
|
||||
import com.simplemobiletools.launcher.extensions.getCellCount
|
||||
import com.simplemobiletools.launcher.helpers.COLUMN_COUNT
|
||||
import com.simplemobiletools.launcher.helpers.MAX_CLICK_DURATION
|
||||
import com.simplemobiletools.launcher.helpers.ROW_COUNT
|
||||
import com.simplemobiletools.launcher.models.HomeScreenGridItem
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: Int) : RelativeLayout(context, attrs, defStyle) {
|
||||
|
@ -49,7 +49,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
|
||||
resizeWidgetLinePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
color = Color.WHITE
|
||||
strokeWidth = context.resources.getDimension(R.dimen.tiny_margin)
|
||||
strokeWidth = context.resources.getDimension(com.simplemobiletools.commons.R.dimen.tiny_margin)
|
||||
style = Paint.Style.STROKE
|
||||
}
|
||||
|
||||
|
@ -76,12 +76,12 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
it.provider.className == gridItem.className
|
||||
} ?: return
|
||||
|
||||
minResizeWidthCells = Math.min(COLUMN_COUNT, context.getCellCount(providerInfo.minResizeWidth))
|
||||
minResizeHeightCells = Math.min(ROW_COUNT, context.getCellCount(providerInfo.minResizeHeight))
|
||||
minResizeWidthCells = Math.min(context.config.homeColumnCount, context.getCellCount(providerInfo.minResizeWidth))
|
||||
minResizeHeightCells = Math.min(context.config.homeRowCount, context.getCellCount(providerInfo.minResizeHeight))
|
||||
redrawFrame()
|
||||
|
||||
occupiedCells.clear()
|
||||
allGridItems.forEach { item ->
|
||||
allGridItems.toImmutableList().forEach { item ->
|
||||
for (xCell in item.left..item.right) {
|
||||
for (yCell in item.top..item.bottom) {
|
||||
occupiedCells.add(Pair(xCell, yCell))
|
||||
|
@ -123,6 +123,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
dragDirection = DRAGGING_BOTTOM
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
val minWidth = minResizeWidthCells * cellWidth
|
||||
val minHeight = minResizeHeightCells * cellHeight
|
||||
|
@ -153,6 +154,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
|
||||
frameRect.left = wantedLeft
|
||||
}
|
||||
|
||||
DRAGGING_TOP -> {
|
||||
val newHeight = frameRect.bottom - event.rawY.toInt()
|
||||
val wantedTop = if (newHeight >= minHeight) {
|
||||
|
@ -179,6 +181,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
|
||||
frameRect.top = wantedTop
|
||||
}
|
||||
|
||||
DRAGGING_RIGHT -> {
|
||||
val newWidth = event.rawX.toInt() - frameRect.left
|
||||
val wantedRight = if (newWidth >= minWidth) {
|
||||
|
@ -205,6 +208,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
|
||||
frameRect.right = wantedRight
|
||||
}
|
||||
|
||||
DRAGGING_BOTTOM -> {
|
||||
val newHeight = event.rawY.toInt() - frameRect.top
|
||||
val wantedBottom = if (newHeight >= minHeight) {
|
||||
|
@ -224,7 +228,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
}
|
||||
}
|
||||
|
||||
if (wantedBottomCellY == ROW_COUNT - 1) {
|
||||
if (wantedBottomCellY == context.config.homeRowCount - 1) {
|
||||
areAllCellsFree = false
|
||||
}
|
||||
|
||||
|
@ -241,6 +245,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
redrawFrame()
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
if (dragDirection == DRAGGING_NONE) {
|
||||
onClickListener?.invoke()
|
||||
|
@ -269,6 +274,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
frameRect.left = cellsRect.left * cellWidth + sideMargins.left
|
||||
}
|
||||
}
|
||||
|
||||
DRAGGING_TOP -> {
|
||||
val wantedTop = roundToClosestMultiplyOfNumber(frameRect.top - sideMargins.top, cellHeight)
|
||||
val wantedTopCellY = wantedTop / cellHeight
|
||||
|
@ -289,6 +295,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
frameRect.top = cellsRect.top * cellHeight + sideMargins.top
|
||||
}
|
||||
}
|
||||
|
||||
DRAGGING_RIGHT -> {
|
||||
val wantedRight = roundToClosestMultiplyOfNumber(frameRect.right - sideMargins.left, cellWidth)
|
||||
val wantedRightCellX = wantedRight / cellWidth - 1
|
||||
|
@ -309,6 +316,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
frameRect.right = (cellsRect.right + 1) * cellWidth + sideMargins.left
|
||||
}
|
||||
}
|
||||
|
||||
DRAGGING_BOTTOM -> {
|
||||
val wantedBottom = roundToClosestMultiplyOfNumber(frameRect.bottom - sideMargins.top, cellHeight)
|
||||
val wantedBottomCellY = wantedBottom / cellHeight - 1
|
||||
|
@ -322,7 +330,7 @@ class MyAppWidgetResizeFrame(context: Context, attrs: AttributeSet, defStyle: In
|
|||
}
|
||||
}
|
||||
|
||||
if (wantedBottomCellY == ROW_COUNT - 1) {
|
||||
if (wantedBottomCellY == context.config.homeRowCount - 1) {
|
||||
areAllCellsFree = false
|
||||
}
|
||||
|
||||
|
|
|
@ -4,18 +4,9 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.simplemobiletools.launcher.views.HomeScreenGrid
|
||||
<include
|
||||
android:id="@+id/home_screen_grid"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.simplemobiletools.launcher.views.MyAppWidgetResizeFrame
|
||||
android:id="@+id/resize_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="gone" />
|
||||
|
||||
</com.simplemobiletools.launcher.views.HomeScreenGrid>
|
||||
layout="@layout/home_screen_grid" />
|
||||
|
||||
<include
|
||||
android:id="@+id/all_apps_fragment"
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
style="@style/SettingsHolderTextViewOneLinerStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_top_corners">
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_purchase_thank_you"
|
||||
|
@ -85,7 +85,7 @@
|
|||
style="@style/SettingsHolderCheckboxStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_bottom_corners">
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
||||
android:id="@+id/settings_use_english"
|
||||
|
@ -125,7 +125,7 @@
|
|||
style="@style/SettingsHolderTextViewOneLinerStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_bottom_corners">
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_manage_hidden_icons"
|
||||
|
@ -135,6 +135,132 @@
|
|||
android:text="@string/manage_hidden_icons" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/settings_general_settings_divider"
|
||||
layout="@layout/divider" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/settings_drawer_settings_label"
|
||||
style="@style/SettingsSectionLabelStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/app_drawer_settings" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_drawer_column_count_holder"
|
||||
style="@style/SettingsHolderTextViewOneLinerStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_drawer_column_count_label"
|
||||
style="@style/SettingsTextLabelStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/column_count" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_drawer_column_count"
|
||||
style="@style/SettingsTextValueStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/settings_drawer_column_count_label"
|
||||
tools:text="3" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_drawer_search_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
||||
android:id="@+id/settings_show_search_bar"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_search" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_close_app_drawer_on_other_app_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
||||
android:id="@+id/settings_close_app_drawer_on_other_app"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/close_app_drawer_on_app_open" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/settings_drawer_settings_divider"
|
||||
layout="@layout/divider" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/settings_home_screen_label"
|
||||
style="@style/SettingsSectionLabelStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/home_screen_settings" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_home_screen_row_count_holder"
|
||||
style="@style/SettingsHolderTextViewOneLinerStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_home_screen_row_count_label"
|
||||
style="@style/SettingsTextLabelStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/row_count" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_home_screen_row_count"
|
||||
style="@style/SettingsTextValueStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/settings_home_screen_row_count_label"
|
||||
tools:text="3" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_home_screen_column_count_holder"
|
||||
style="@style/SettingsHolderTextViewOneLinerStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_background">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_home_screen_column_count_label"
|
||||
style="@style/SettingsTextLabelStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/column_count" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_home_screen_column_count"
|
||||
style="@style/SettingsTextValueStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/settings_home_screen_column_count_label"
|
||||
tools:text="3" />
|
||||
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
|
|
@ -5,10 +5,16 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.simplemobiletools.commons.views.MySearchMenu
|
||||
android:id="@+id/search_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
android:id="@+id/all_apps_fastscroller"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/search_bar"
|
||||
app:fastScrollEnabled="false">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
|
@ -20,4 +26,21 @@
|
|||
app:spanCount="@integer/portrait_column_count" />
|
||||
|
||||
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/no_results_placeholder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/search_bar"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_marginTop="@dimen/bigger_margin"
|
||||
android:alpha="0.8"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="@dimen/activity_margin"
|
||||
android:paddingRight="@dimen/activity_margin"
|
||||
android:text="@string/no_items_found"
|
||||
android:textSize="@dimen/bigger_text_size"
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone" />
|
||||
|
||||
</com.simplemobiletools.launcher.fragments.AllAppsFragment>
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/dialog_folder_icons_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="@dimen/small_margin"
|
||||
android:layout_marginTop="@dimen/medium_margin"
|
||||
android:layout_marginEnd="@dimen/small_margin"
|
||||
android:minHeight="@dimen/min_folder_view_height"
|
||||
app:layout_constraintHeight_max="@dimen/max_folder_view_height">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/dialog_folder_icons_grid"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:itemCount="10"
|
||||
tools:listitem="@layout/item_launcher_label" />
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
</FrameLayout>
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.simplemobiletools.launcher.views.HomeScreenGrid xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/home_screen_grid"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!-- Drawing area with Z translation so it is drawn over widgets -->
|
||||
<com.simplemobiletools.launcher.views.HomeScreenGridDrawingArea
|
||||
android:id="@+id/drawing_area"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:translationZ="1dp"/>
|
||||
|
||||
<com.simplemobiletools.launcher.views.MyAppWidgetResizeFrame
|
||||
android:id="@+id/resize_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="gone" />
|
||||
|
||||
</com.simplemobiletools.launcher.views.HomeScreenGrid>
|
|
@ -27,4 +27,10 @@
|
|||
android:maxLines="2"
|
||||
android:textSize="@dimen/smaller_text_size" />
|
||||
|
||||
<View
|
||||
android:id="@+id/popup_anchor"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:gravity="center_horizontal|top" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -1,34 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/app_info"
|
||||
android:icon="@drawable/ic_info_vector"
|
||||
android:title="@string/app_info"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/hide_icon"
|
||||
android:icon="@drawable/ic_hide_vector"
|
||||
android:title="@string/hide"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/resize"
|
||||
android:icon="@drawable/ic_resize_vector"
|
||||
android:title="@string/resize"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/rename"
|
||||
android:icon="@drawable/ic_rename_vector"
|
||||
android:title="@string/rename"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/remove"
|
||||
android:icon="@drawable/ic_cross_vector"
|
||||
android:title="@string/remove"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/uninstall"
|
||||
android:icon="@drawable/ic_delete_vector"
|
||||
android:title="@string/uninstall"
|
||||
app:showAsAction="always" />
|
||||
<group android:id="@+id/group_main">
|
||||
<item
|
||||
android:id="@+id/app_info"
|
||||
android:icon="@drawable/ic_info_vector"
|
||||
android:title="@string/app_info"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/hide_icon"
|
||||
android:icon="@drawable/ic_hide_vector"
|
||||
android:title="@string/hide"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/resize"
|
||||
android:icon="@drawable/ic_resize_vector"
|
||||
android:title="@string/resize"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/rename"
|
||||
android:icon="@drawable/ic_rename_vector"
|
||||
android:title="@string/rename"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/remove"
|
||||
android:icon="@drawable/ic_cross_vector"
|
||||
android:title="@string/remove"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/uninstall"
|
||||
android:icon="@drawable/ic_delete_vector"
|
||||
android:title="@string/uninstall"
|
||||
app:showAsAction="always" />
|
||||
</group>
|
||||
<group android:id="@+id/group_shortcuts" />
|
||||
</menu>
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
<string name="manage_hidden_icons">إدارة اﻷيقونات المخفية</string>
|
||||
<string name="hidden_icons">اﻷيقونات المخفية</string>
|
||||
<string name="hidden_icons_placeholder">لا يمكن إلغاء تثبيت بعض التطبيقات بسبب قيود النظام، ولكن يمكن إخفاء أيقوناتها لتجنب ظهورها.</string>
|
||||
<string name="app_drawer_settings">درج التطبيق</string>
|
||||
<string name="close_app_drawer_on_app_open">إغلاق درج التطبيق عند فتح تطبيق</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">الأداة كبيرة جدًا بالنسبة لحجم الشاشة الرئيسية الحالي</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Обикновен Начален Екран</string>
|
||||
<string name="app_launcher_name">Начален Екран</string>
|
||||
<string name="launcher_settings">Начален Екран Настройки</string>
|
||||
<string name="app_info">Информация за приложението</string>
|
||||
<string name="touch_hold_widget">Натиснете дълго приспособлението и го плъзнете на началния екран</string>
|
||||
<string name="uninstall">Деинсталиране</string>
|
||||
<string name="hide_icon">Скриване на иконата</string>
|
||||
<string name="add_hidden_icons">Добавяне на скритите икони</string>
|
||||
<string name="manage_hidden_icons">Управлявай скритите икони</string>
|
||||
<string name="hidden_icons">Скрити икони</string>
|
||||
<string name="hidden_icons_placeholder">Някои приложения не могат да бъдат деинсталирани поради системни ограничения, но можете поне да скриете иконите им, за да не ги виждате.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Gestiona les icones ocultes</string>
|
||||
<string name="hidden_icons">Icones ocultes</string>
|
||||
<string name="hidden_icons_placeholder">Algunes aplicacions no es poden desinstal·lar a causa de les restriccions del sistema, però almenys podeu ocultar les seves icones per evitar que es vegin.</string>
|
||||
<string name="app_drawer_settings">Calaix d\'aplicacions</string>
|
||||
<string name="close_app_drawer_on_app_open">Tanca el calaix d\'aplicacions en obrir una aplicació</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">El giny és massa gros per a la mida de la pantalla d\'inici actual</string>
|
||||
</resources>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Simple Launcher</string>
|
||||
<string name="app_launcher_name">Launcher</string>
|
||||
<string name="launcher_settings">ڕێکخستنەکان</string>
|
||||
<string name="app_info">زانیاری بەرنامە</string>
|
||||
<string name="touch_hold_widget">ماوەیەک دەست ڕاگرە لەسەر کورتکراوەکە بۆ زیادکردن بۆسەر شاشەی سەرەکی</string>
|
||||
<string name="uninstall">سڕینەوە</string>
|
||||
<string name="hide_icon">شاردنەوەی ئایکۆن</string>
|
||||
<string name="add_hidden_icons">زیادکردنی ئایکۆنە شاراوەکان</string>
|
||||
<string name="manage_hidden_icons">ڕێکخستنی ئایکۆنە شاراوەکان</string>
|
||||
<string name="hidden_icons">ئایکۆنە شاراوەکان</string>
|
||||
<string name="hidden_icons_placeholder">هەندێ بەرنامە ناتوانرێ بسڕدرێتەوە بەهۆی ڕێگریکردنی سیستەمەوە، بەڵام ئەتوانی ئایکۆنەکەی بشاریتەوە لە لیستەکەدا.</string>
|
||||
<string name="app_drawer_settings">پیشاندانی بەرنامەکان</string>
|
||||
<string name="close_app_drawer_on_app_open">داخستنی پیشاندەری بەرنامەکان لەکاتی کردنەوەی بەرنامەکاندا</string>
|
||||
<string name="home_screen_settings">شاشەی سەرەکی</string>
|
||||
<string name="widget_too_big">قەبارەی کورتکراوەکە زۆر گەورەیە بۆ زیادکردنی بۆ شاشەی سەرەکی</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Spravovat skryté ikony</string>
|
||||
<string name="hidden_icons">Skryté ikony</string>
|
||||
<string name="hidden_icons_placeholder">Některé aplikace nelze kvůli systémovým omezením odinstalovat. Ale můžete alespoň skrýt jejich ikony, abyste je neviděli.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Ausgeblendete Symbole verwalten</string>
|
||||
<string name="hidden_icons">Ausgeblendete Symbole</string>
|
||||
<string name="hidden_icons_placeholder">Einige Apps können aufgrund von Systemeinschränkungen nicht deinstalliert werden, aber du kannst zumindest ihre Symbole ausblenden, um sie nicht zu sehen.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">App-Schublade</string>
|
||||
<string name="close_app_drawer_on_app_open">App-Schublade beim Öffnen einer App schließen</string>
|
||||
<string name="home_screen_settings">Startbildschirm</string>
|
||||
<string name="widget_too_big">Das Widget ist zu groß für den aktuellen Startbildschirm</string>
|
||||
</resources>
|
||||
|
|
|
@ -10,7 +10,11 @@
|
|||
<string name="add_hidden_icons">Προσθήκη κρυφών εικονιδίων</string>
|
||||
<string name="manage_hidden_icons">Διαχείριση κρυφών εικονιδίων</string>
|
||||
<string name="hidden_icons">Κρυφά εικονίδια</string>
|
||||
<string name="hidden_icons_placeholder">Ορισμένες εφαρμογές δεν μπορούν να απεγκατασταθούν λόγω περιορισμών του συστήματος, αλλά μπορείτε να αποκρύψετε τα εικονίδια τους για να μην τις βλέπετε.</string>
|
||||
<string name="hidden_icons_placeholder">Ορισμένες εφαρμογές δεν μπορούν να απεγκατασταθούν λόγω περιορισμών του συστήματος, αλλά μπορείτε να αποκρύψετε τα εικονίδια τους για να μην φαίνονται.</string>
|
||||
<string name="app_drawer_settings">Συρτάρι εφαρμογών</string>
|
||||
<string name="close_app_drawer_on_app_open">Κλείστε το συρτάρι εφαρμογών κατά το άνοιγμα μιας εφαρμογής</string>
|
||||
<string name="home_screen_settings">Αρχική οθόνη</string>
|
||||
<string name="widget_too_big">Το γραφικό είναι πολύ μεγάλο για το τρέχον μέγεθος της αρχικής οθόνης</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Gestionar los iconos ocultos</string>
|
||||
<string name="hidden_icons">Iconos ocultos</string>
|
||||
<string name="hidden_icons_placeholder">Algunas aplicaciones no se pueden desinstalar debido a las restricciones del sistema, pero al menos puedes ocultar sus iconos para evitar verlas.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">Cajón de aplicaciones</string>
|
||||
<string name="close_app_drawer_on_app_open">Cerrar el cajón de aplicaciones al abrir una aplicación</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">El widget es demasiado grande para el tamaño actual de la pantalla de inicio</string>
|
||||
</resources>
|
|
@ -5,10 +5,14 @@
|
|||
<string name="launcher_settings">Käivitaja seadistused</string>
|
||||
<string name="app_info">Rakenduse teave</string>
|
||||
<string name="touch_hold_widget">Vajutage pikalt vidinat ja lohistage see oma koduekraanile</string>
|
||||
<string name="uninstall">Desinstallige</string>
|
||||
<string name="uninstall">Eemalda rakendus</string>
|
||||
<string name="hide_icon">Peida ikoon</string>
|
||||
<string name="add_hidden_icons">Lisa peidetud ikoone</string>
|
||||
<string name="manage_hidden_icons">Halda peidetud ikoone</string>
|
||||
<string name="hidden_icons">Peidetud ikoonid</string>
|
||||
<string name="hidden_icons_placeholder">Mõnda rakendust ei saa süsteemipiirangute tõttu eemaldada. Selleks, et neid mitte näha, võid vähemalt nende ikoonid ära peita.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">Rakenduste kaust</string>
|
||||
<string name="close_app_drawer_on_app_open">Rakenduse avamisel sulge rakenduste kausta vaade</string>
|
||||
<string name="home_screen_settings">Avaleht</string>
|
||||
<string name="widget_too_big">Vidin on liiga suur praeguse ekraanimõõdu jaoks</string>
|
||||
</resources>
|
|
@ -2,13 +2,17 @@
|
|||
<resources>
|
||||
<string name="app_name">Yksinkertainen käynnistin</string>
|
||||
<string name="app_launcher_name">Käynnistin</string>
|
||||
<string name="launcher_settings">Launcher Settings</string>
|
||||
<string name="launcher_settings">Käynnistimen asetukset</string>
|
||||
<string name="app_info">Sovelluksen tiedot</string>
|
||||
<string name="touch_hold_widget">Paina widgettiä pitkään ja vedä se aloitusnäytöllesi</string>
|
||||
<string name="uninstall">Poista asennus</string>
|
||||
<string name="hide_icon">Hide icon</string>
|
||||
<string name="add_hidden_icons">Add hidden icons</string>
|
||||
<string name="manage_hidden_icons">Manage hidden icons</string>
|
||||
<string name="hidden_icons">Hidden icons</string>
|
||||
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
|
||||
<string name="hide_icon">Piilota kuvake</string>
|
||||
<string name="add_hidden_icons">Lisää piilotettuja kuvakkeita</string>
|
||||
<string name="manage_hidden_icons">Hallitse piilotettuja kuvakkeita</string>
|
||||
<string name="hidden_icons">Piilotetut kuvakkeet</string>
|
||||
<string name="hidden_icons_placeholder">Joitakin sovelluksia ei ole järjestelmärajoitusten vuoksi mahdollista poistaa, mutta voit kuitenkin piilottaa niiden kuvakkeet näkyvistä.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Gérer les icônes cachées</string>
|
||||
<string name="hidden_icons">Icônes cachées</string>
|
||||
<string name="hidden_icons_placeholder">Certaines applications ne peuvent pas être désinstallées en raison de restrictions du système, mais vous pouvez au moins masquer leurs icônes pour éviter de les voir.</string>
|
||||
<string name="app_drawer_settings">Tiroir d\'appli</string>
|
||||
<string name="close_app_drawer_on_app_open">Fermer le tiroir de l\'appli à l\'ouverture d\'une application</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Le widget est trop grand pour la taille actuelle de l\'écran</string>
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Xestionar iconas ocultas</string>
|
||||
<string name="hidden_icons">Iconas ocultas</string>
|
||||
<string name="hidden_icons_placeholder">Algunhas aplicacións non se poden desinstalar debido ás restricións do sistema, pero polo menos podes ocultar as súas iconas para evitar velas.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -4,11 +4,15 @@
|
|||
<string name="app_launcher_name">Pokretač</string>
|
||||
<string name="launcher_settings">Postavke pokretača</string>
|
||||
<string name="app_info">Informacije o aplikaciji</string>
|
||||
<string name="touch_hold_widget">Dugo pritisnite dodatak i povucite ga na početni zaslon</string>
|
||||
<string name="touch_hold_widget">Pritisni widget i povuci ga na početni ekran</string>
|
||||
<string name="uninstall">Deinstaliraj</string>
|
||||
<string name="hide_icon">Sakrij ikonu</string>
|
||||
<string name="add_hidden_icons">Dodajte skrivene ikone</string>
|
||||
<string name="manage_hidden_icons">Upravljanje skrivenim ikonama</string>
|
||||
<string name="hidden_icons">Skrivene ikone</string>
|
||||
<string name="hidden_icons_placeholder">Neke aplikacije nije moguće deinstalirati zbog ograničenja sustava, ali možete barem sakriti njihove ikone da ih ne vidite.</string>
|
||||
</resources>
|
||||
<string name="hidden_icons_placeholder">Neke aplikacije se ne mogu deinstalirati zbog ograničenja sustava, ali njihove ikone možeš sakriti.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Rejtett ikonok kezelése</string>
|
||||
<string name="hidden_icons">Rejtett ikonok</string>
|
||||
<string name="hidden_icons_placeholder">Egyes alkalmazások rendszerkorlátozások miatt nem távolíthatók el, de legalább elrejtheti az ikonjaikat, hogy ne lássa őket.</string>
|
||||
<string name="app_drawer_settings">Alkalmazásfiók</string>
|
||||
<string name="close_app_drawer_on_app_open">Alkalmazásfiók bezárása egy alkalmazás megnyitásakor</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">A modul túl nagy az aktuális kezdőképernyő méretéhez</string>
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Kelola ikon tersembunyi</string>
|
||||
<string name="hidden_icons">Ikon tersembunyi</string>
|
||||
<string name="hidden_icons_placeholder">Beberapa aplikasi tidak dapat di-uninstal karena keterbatasan sistem, tetapi Anda masih dapat menyembunyikan ikon mereka untuk menyembunyikannya.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Gestisci le icone nascoste</string>
|
||||
<string name="hidden_icons">Icone nascoste</string>
|
||||
<string name="hidden_icons_placeholder">Alcune applicazioni non possono essere disinstallate a causa di restrizioni di sistema, ma è possibile almeno nascondere le loro icone per evitare di vederle.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">Cassetto app</string>
|
||||
<string name="close_app_drawer_on_app_open">Chiudi il cassetto app all\'apertura di un\'app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Il widget è troppo grande per le dimensioni attuali della schermata principale</string>
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">ניהול אייקונים נסתרים</string>
|
||||
<string name="hidden_icons">אייקונים נסתרים</string>
|
||||
<string name="hidden_icons_placeholder">חלק מהאפליקציות לא ניתנות להסרה עקב הגבלות מערכת, לפחות אתה יכול להחביא את האייקונים כדי לא לראותם במסך הבית.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">非表示アイコンの管理</string>
|
||||
<string name="hidden_icons">非表示のアイコン</string>
|
||||
<string name="hidden_icons_placeholder">一部のアプリはシステムの制限によりアンインストールできませんが、非表示によって表示されないようにすることはできます。</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
<string name="manage_hidden_icons">Manage hidden icons</string>
|
||||
<string name="hidden_icons">Hidden icons</string>
|
||||
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">മറഞ്ഞിരിക്കുന്ന ബിംബം കൈകാര്യം ചെയ്യുക</string>
|
||||
<string name="hidden_icons">മറഞ്ഞിരിക്കുന്ന ബിംബ</string>
|
||||
<string name="hidden_icons_placeholder">സിസ്റ്റം നിയന്ത്രണങ്ങൾ കാരണം ചില ആപ്പുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവ കാണാതിരിക്കാൻ നിങ്ങൾക്ക് അവയുടെ ഐക്കണുകളെങ്കിലും മറയ്ക്കാം.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Simple Launcher</string>
|
||||
<string name="app_launcher_name">Oppstarter</string>
|
||||
<string name="launcher_settings">Launcher Settings</string>
|
||||
<string name="app_launcher_name">App-starter</string>
|
||||
<string name="launcher_settings">Innstillinger for App-starter</string>
|
||||
<string name="app_info">Programinfo</string>
|
||||
<string name="touch_hold_widget">Lang-trykk miniprogrammet og dra det til din hjemmeskjerm</string>
|
||||
<string name="uninstall">Avinstaller</string>
|
||||
<string name="hide_icon">Hide icon</string>
|
||||
<string name="add_hidden_icons">Add hidden icons</string>
|
||||
<string name="manage_hidden_icons">Manage hidden icons</string>
|
||||
<string name="hidden_icons">Hidden icons</string>
|
||||
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
|
||||
<string name="hide_icon">Skjul ikon</string>
|
||||
<string name="add_hidden_icons">Legg til skjulte ikoner</string>
|
||||
<string name="manage_hidden_icons">Håndter skjulte ikoner</string>
|
||||
<string name="hidden_icons">Skjulte ikoner</string>
|
||||
<string name="hidden_icons_placeholder">Noen apper kan ikke avinstalleres pga. systemrestriksjoner, men du kan i det minste skjule deres ikoner for å unngå å se dem.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Verborgen iconen beheren</string>
|
||||
<string name="hidden_icons">Verborgen iconen</string>
|
||||
<string name="hidden_icons_placeholder">Sommige apps kunnen niet worden verwijderd van het systeem, maar hun iconen kunnen wel worden verborgen.</string>
|
||||
<string name="app_drawer_settings">App-overzicht</string>
|
||||
<string name="close_app_drawer_on_app_open">App-overzicht sluiten na het kiezen van een app</string>
|
||||
<string name="home_screen_settings">Beginscherm</string>
|
||||
<string name="widget_too_big">Widget is te groot voor de huidige afmetingen van het beginscherm</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">لُکاۓ آئیکون دیاں سیٹنگاں</string>
|
||||
<string name="hidden_icons">لُکاۓ آئیکون</string>
|
||||
<string name="hidden_icons_placeholder">سِسٹم پابندیاں کرکے کجھ اَیپاں اݨاینسٹال کر نہیں سکیاں، پر تسیں آئیکون لُکا سکدے او۔</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Zarządzaj ukrytymi ikonami</string>
|
||||
<string name="hidden_icons">Ukryte ikony</string>
|
||||
<string name="hidden_icons_placeholder">Niektórych aplikacji nie można odinstalować ze względu na ograniczenia systemowe, ale możesz przynajmniej ukryć ich ikony, aby ich nie widzieć.</string>
|
||||
<string name="app_drawer_settings">Szuflada aplikacji</string>
|
||||
<string name="close_app_drawer_on_app_open">Zamykaj szufladę aplikacji przy uruchomieniu aplikacji</string>
|
||||
<string name="home_screen_settings">Ekran główny</string>
|
||||
<string name="widget_too_big">Widżet jest za duży dla aktualnego rozmiaru ekranu głównego</string>
|
||||
</resources>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<resources>
|
||||
<string name="app_name">Simple Launcher</string>
|
||||
<string name="app_launcher_name">Launcher</string>
|
||||
<string name="launcher_settings">Launcher Settings</string>
|
||||
<string name="launcher_settings">Configurações do Iniciador</string>
|
||||
<string name="app_info">Informações do aplicativo</string>
|
||||
<string name="touch_hold_widget">Toque e segure o widget e arraste-o para sua tela inicial</string>
|
||||
<string name="uninstall">Desinstalar</string>
|
||||
|
@ -11,6 +11,10 @@
|
|||
<string name="manage_hidden_icons">Gerenciar ícones ocultos</string>
|
||||
<string name="hidden_icons">Ícones ocultos</string>
|
||||
<string name="hidden_icons_placeholder">Alguns aplicativos não podem ser desinstalados devido a restrições do sistema, mas você pode ao menos ocultar seus ícones para evitar vê-los.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -11,8 +11,12 @@
|
|||
<string name="manage_hidden_icons">Gerir ícones ocultos</string>
|
||||
<string name="hidden_icons">Ícones ocultos</string>
|
||||
<string name="hidden_icons_placeholder">Algumas aplicações não podem ser desinstaladas mas pode ocultar os seus ícones.</string>
|
||||
<string name="app_drawer_settings">Menu de aplicações</string>
|
||||
<string name="close_app_drawer_on_app_open">Fechar menu de aplicações ao abrir uma aplicação</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">O Widget é muito grande para o ecrã disponível</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Manage hidden icons</string>
|
||||
<string name="hidden_icons">Hidden icons</string>
|
||||
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Управление скрытыми значками</string>
|
||||
<string name="hidden_icons">Скрытые значки</string>
|
||||
<string name="hidden_icons_placeholder">Некоторые приложения нельзя удалить из-за системных ограничений, но можно скрыть их значки.</string>
|
||||
<string name="app_drawer_settings">Панель приложения</string>
|
||||
<string name="close_app_drawer_on_app_open">Закрывать боковую панель при открытии приложения</string>
|
||||
<string name="home_screen_settings">Домашний экран</string>
|
||||
<string name="widget_too_big">Виджет слишком велик для текущего размера домашнего экрана</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
<string name="manage_hidden_icons">Spravovať skryté ikonky</string>
|
||||
<string name="hidden_icons">Skryté ikonky</string>
|
||||
<string name="hidden_icons_placeholder">Niektoré apky nemôžu byť odinštalované kvôli systémovým obmedzeniam, viete ich ale aspoň skryť, aby ste ich nevideli.</string>
|
||||
<string name="app_drawer_settings">Zoznam apiek</string>
|
||||
<string name="close_app_drawer_on_app_open">Zavrieť zoznam apiek po spustení apky</string>
|
||||
<string name="home_screen_settings">Domáca obrazovka</string>
|
||||
<string name="widget_too_big">Widget je príliš veľký pre súčasnú domácu obrazovku</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Upravljajte s skritimi ikonami</string>
|
||||
<string name="hidden_icons">Skrite ikone</string>
|
||||
<string name="hidden_icons_placeholder">Določenih aplikacij zaradi sistemskih omejitev ni mogoče odstraniti, njihove ikone pa skrijete, da jih ne vidite.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Управљајте скривеним иконама</string>
|
||||
<string name="hidden_icons">Скривене иконе</string>
|
||||
<string name="hidden_icons_placeholder">Неке апликације се не могу деинсталирати због системских ограничења, али можете барем сакрити њихове иконе да их не видите.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Hantera dolda ikoner</string>
|
||||
<string name="hidden_icons">Dolda ikoner</string>
|
||||
<string name="hidden_icons_placeholder">Vissa appar kan inte avinstalleras på grund av systembegränsningar, men du kan åtminstone dölja deras ikoner för att slippa se dem.</string>
|
||||
<string name="app_drawer_settings">Applåda</string>
|
||||
<string name="close_app_drawer_on_app_open">Stäng applådan när en app öppnas</string>
|
||||
<string name="home_screen_settings">Startskärm</string>
|
||||
<string name="widget_too_big">Widgeten är för stor för startskärmens aktuella storlek</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Gizli simgeleri yönet</string>
|
||||
<string name="hidden_icons">Gizli simgeler</string>
|
||||
<string name="hidden_icons_placeholder">Bazı uygulamalar sistem kısıtlamaları nedeniyle kaldırılamaz, ancak en azından onları görmemek için simgelerini gizleyebilirsiniz.</string>
|
||||
<string name="app_drawer_settings">Uygulama çekmecesi</string>
|
||||
<string name="close_app_drawer_on_app_open">Bir uygulama açıldığında uygulama çekmecesini kapat</string>
|
||||
<string name="home_screen_settings">Ana ekran</string>
|
||||
<string name="widget_too_big">Widget, şu anki ana ekran boyutu için çok büyük</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Simple Launcher</string>
|
||||
<string name="app_launcher_name">Launcher</string>
|
||||
<string name="app_name">Простий Лаунчер</string>
|
||||
<string name="app_launcher_name">Лаунчер</string>
|
||||
<string name="launcher_settings">Налаштування</string>
|
||||
<string name="app_info">Про застосунок</string>
|
||||
<string name="touch_hold_widget">Натисніть і утримуйте віджет і перетягніть його на головний екран</string>
|
||||
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">Керування прихованими піктограмами</string>
|
||||
<string name="hidden_icons">Приховані піктограми</string>
|
||||
<string name="hidden_icons_placeholder">Деякі застосунки не можна видалити через системні обмеження, але ви можете принаймні приховати їх піктограми, щоб уникнути їх перегляду.</string>
|
||||
</resources>
|
||||
<string name="app_drawer_settings">Панель застосунку</string>
|
||||
<string name="close_app_drawer_on_app_open">Закривати панель застосунок при відкриті застосунку</string>
|
||||
<string name="home_screen_settings">Домашній екран</string>
|
||||
<string name="widget_too_big">Віджет надто великий для поточного розміру домашнього екрану</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">ⴰⵙⵡⵓⴷⴷⵓ ⵏ ⵜⵙⵓⵔⴰ ⵉⴼⴼⵔⵏ</string>
|
||||
<string name="hidden_icons">ⵜⵉⵙⵓⵔⴰ ⵉⴼⴼⵔⵏ</string>
|
||||
<string name="hidden_icons_placeholder">ⵓⵔ ⵜⵣⵔⵉⵏ ⵜⵓⵙⵙⵔⴰ ⵏ ⴽⵔⴰ ⵏ ⵜⵙⵏⵙⵉⵡⵉⵏ ⵙ ⵜⵎⵏⵜⵉⵍⵜ ⵏ ⵉⵙⵍⴳⵏⵏ ⵏ ⵓⵏⴳⵔⴰⵡ, ⵎⴰⵛⴰ ⵜⵣⵔⵉ ⵜⵓⴼⴼⵔⴰ ⵏ ⵜⵙⵓⵔⴰ ⵏⵏⵙⵏⵜ ⵃⵎⴰ ⵓⵔ ⴷ ⵜⵜⴹⵀⴰⵕⵏⵜ.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
</resources>
|
||||
|
|
|
@ -11,4 +11,8 @@
|
|||
<string name="manage_hidden_icons">管理隐藏的图标</string>
|
||||
<string name="hidden_icons">隐藏的图标</string>
|
||||
<string name="hidden_icons_placeholder">某些应用因系统限制而无法卸载, 但你至少可以隐藏它们的图标避免看见它们。</string>
|
||||
<string name="app_drawer_settings">应用抽屉</string>
|
||||
<string name="close_app_drawer_on_app_open">打开抽屉内应用时关闭抽屉</string>
|
||||
<string name="home_screen_settings">主屏幕</string>
|
||||
<string name="widget_too_big">小部件对当前屏幕尺寸而言太大了</string>
|
||||
</resources>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">簡易啟動器</string>
|
||||
<string name="app_launcher_name">啟動器</string>
|
||||
<string name="launcher_settings">啟動器設定</string>
|
||||
<string name="app_info">應用程式資訊</string>
|
||||
<string name="touch_hold_widget">長按小工具並將其拖曳至你的主畫面</string>
|
||||
<string name="uninstall">解除安裝</string>
|
||||
<string name="hide_icon">隱藏圖示</string>
|
||||
<string name="add_hidden_icons">新增隱藏圖示</string>
|
||||
<string name="manage_hidden_icons">管理隱藏圖示</string>
|
||||
<string name="hidden_icons">隱藏圖示</string>
|
||||
<string name="hidden_icons_placeholder">由於系統限制,有些應用程式無法被移除,但您至少可以將它們的圖示隱藏起來,避免看到它們。</string>
|
||||
<string name="app_drawer_settings">應用程式抽屜</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
|
@ -5,5 +5,11 @@
|
|||
<dimen name="widget_preview_size">140dp</dimen>
|
||||
<dimen name="icon_side_margin">10dp</dimen>
|
||||
<dimen name="resize_frame_dot_radius">8dp</dimen>
|
||||
<dimen name="move_gesture_threshold">5dp</dimen>
|
||||
<dimen name="move_gesture_threshold">20dp</dimen>
|
||||
<dimen name="page_indicator_dot_radius">6dp</dimen>
|
||||
<dimen name="page_indicator_stroke_width">1dp</dimen>
|
||||
<dimen name="page_indicator_margin">6dp</dimen>
|
||||
<dimen name="min_folder_view_height">200dp</dimen>
|
||||
<dimen name="max_folder_view_height">500dp</dimen>
|
||||
<dimen name="menu_icon_size">24dp</dimen>
|
||||
</resources>
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
<string name="manage_hidden_icons">Manage hidden icons</string>
|
||||
<string name="hidden_icons">Hidden icons</string>
|
||||
<string name="hidden_icons_placeholder">Some apps cannot be uninstalled due to system restrictions, but you can at least hide their icons to avoid seeing them.</string>
|
||||
<string name="app_drawer_settings">App drawer</string>
|
||||
<string name="close_app_drawer_on_app_open">Close app drawer on opening an app</string>
|
||||
<string name="home_screen_settings">Home screen</string>
|
||||
<string name="widget_too_big">Widget is too big for current home screen size</string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="android:enforceNavigationBarContrast">false</item>
|
||||
<item name="android:enforceStatusBarContrast">false</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
|
|
30
build.gradle
|
@ -1,30 +0,0 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.3.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
plugins {
|
||||
alias(libs.plugins.android).apply(false)
|
||||
alias(libs.plugins.kotlinAndroid).apply(false)
|
||||
alias(libs.plugins.ksp).apply(false)
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
|
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 967 KiB |
After Width: | Height: | Size: 566 KiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 327 KiB |
After Width: | Height: | Size: 244 KiB |
After Width: | Height: | Size: 1.9 MiB |
After Width: | Height: | Size: 652 KiB |
After Width: | Height: | Size: 334 KiB |
After Width: | Height: | Size: 1.9 MiB |
After Width: | Height: | Size: 652 KiB |
After Width: | Height: | Size: 334 KiB |
|
@ -0,0 +1 @@
|
|||
|