forked from skittles9823/QuickSwitch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
quickswitch
342 lines (300 loc) · 10.6 KB
/
quickswitch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
#!/system/bin/sh
# Terminal Magisk Mod Template
# by veez21 @ xda-developers
# Slimmed down for use as an app backend by @Skittles9823
# Magisk Module ID
ID="quickstepswitcher"
# Magisk Mod Directory
if [ -d /data/adb/modules_update/$ID/quickswitch ]; then
MOUNTPATH="/data/adb/modules_update"
else
MOUNTPATH="/data/adb/modules"
fi
MODDIR="$MOUNTPATH/$ID"
[ ! -d $MODDIR ] && { exit 1; }
cd $MODDIR
# Set Log Files
# > Logs should go in this file
mkdir -p $MODDIR/logs
LOG=$MODDIR/logs/$ID-STDERR.log
oldLOG=$MODDIR/logs/$ID-old.log
# > Verbose output goes here
VERLOG=$MODDIR/logs/$ID-verbose.log
oldVERLOG=$MODDIR/logs/$ID-verbose-old.log
stdoutLOG=$MODDIR/logs/$ID-STDOUT.log
oldstdoutLOG=$MODDIR/logs/$ID-STDOUT-old.log
# Start Logging verbosely
mv -f $VERLOG $oldVERLOG 2>/dev/null; mv -f $LOG $oldLOG 2>/dev/null; mv -f $stdoutLOG $oldstdoutLOG 2>/dev/null
exec 3>&1
exec 1>$stdoutLOG
exec 2>$LOG
set -x 2>$VERLOG
########
# Main #
########
API=$(getprop ro.build.version.sdk)
PATH="/sbin/.magisk/busybox:/sbin/:$PATH"
alias aapt='$MODDIR/aapt'
alias sign='$MODDIR/zipsigner'
xml=/data/system/packages.xml
OVERLAYDIR=$MODDIR/overlays/quickswitchoverlay
NAVOVERLAYDIR=$MODDIR/overlays/qnav
RAND=$(echo $RANDOM | sed -r 's|^(...).*|\1|')
QNAV=
DID_MOUNT_RW=
NOBACK=
# Functions to check if dirs is mounted
is_mounted() {
grep " `readlink -f $1` " /proc/mounts 2>/dev/null
return $?
}
is_mounted_rw() {
grep " `readlink -f $1` " /proc/mounts | grep " rw," 2>/dev/null
return $?
}
mount_rw() {
mount -o remount,rw $1
DID_MOUNT_RW=$1
}
unmount_rw() {
if [ "x$DID_MOUNT_RW" = "x$1" ]; then
mount -o remount,ro $1
fi
}
set_perms(){
echo "\nSetting permissions..."
chmod 644 $STEPDIR/*; chown 0:2000 $STEPDIR
if [ ! "$1" == "com.android.systemui" ]; then
chmod 755 $MODDIR/system/etc/; chmod 644 $PERMISSIONXMLDIR/*
chmod 644 $WHITELISTXMLDIR/*; chmod 755 $SYSTEMIZE_TARGET/*
chmod 644 $SYSTEMIZE_TARGET/*/*
fi
}
get_logs(){
overlaylog=$(cmd overlay dump | grep -A 10 "xyz.paphonb.quickstepswitcher.overlay:")
if [ "$overlaylog" ]; then
echo "$overlaylog" > $MODDIR/logs/$ID-overlays.log
else
echo "Overlay not found" > $MODDIR/logs/$ID-overlays.log
fi
echo "---Device Info---" > $MODDIR/logs/$ID-vars.log
grep "^ro.product.device[^#]" /system/build.prop | \
sed 's/ro.product.device/DeviceCode/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.product.model[^#]" /system/build.prop | \
sed 's/ro.product.model/DeviceName/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.build.type[^#]" /system/build.prop | \
sed 's/ro.build.type/BuildType/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.build.version.security_patch[^#]" /system/build.prop | \
sed 's/ro.build.version.security_patch/SecurityPatch/g' \
>> $MODDIR/logs/$ID-vars.log
grep "^ro.product.cpu.abilist[^#]" /system/build.prop | \
sed 's/ro.product.cpu.abilist/Arch/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.build.version.sdk[^#]" /system/build.prop | \
sed 's/ro.build.version.sdk/APIVer/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.build.flavor[^#]" /system/build.prop | \
sed 's/ro.build.flavor/BuildFlavor/g' >> $MODDIR/logs/$ID-vars.log
echo "\n---ROM Info---" >> $MODDIR/logs/$ID-vars.log
grep "^ro.build.host[^#]" /system/build.prop | \
sed 's/ro.build.host/Host/g' >> $MODDIR/logs/$ID-vars.log
grep "^ro.*.device[^#]" /system/build.prop >> $MODDIR/logs/$ID-vars.log
echo -e "\n---Variables---" >> $MODDIR/logs/$ID-vars.log
( set -o posix ; set ) >> $MODDIR/logs/$ID-vars.log
echo -e "\n---Magisk Version---" >> $MODDIR/logs/$ID-vars.log
echo `grep "MAGISK_VER_CODE=" /data/adb/magisk/util_functions.sh | \
sed "s/MAGISK_VER_CODE/MagiskVersion/"` >> $MODDIR/logs/$ID-vars.log
echo -e "\n---Module Version---" >> $MODDIR/logs/$ID-vars.log
echo `grep "versionCode=" $MODDIR/module.prop` >> $MODDIR/logs/$ID-vars.log
find $MODDIR > $MODDIR/logs/find.log
rm -rf /storage/emulated/0/Documents/$ID/*
mkdir -p /storage/emulated/0/Documents/$ID
cp -rf $MODDIR/logs/* /storage/emulated/0/Documents/$ID/
echo "\nLogs copied to /sdcard/Documents/$ID..."
}
reset_provider(){
setvars
rm -rf $MODDIR/system/etc
rm -rf $SYSTEMIZE_TARGET
rm -rf $STEPDIR/QuickstepSwitcherOverlay.apk
rm -rf $MODDIR/system/app/QuickSwitchQNavOverlay.apk
rm -rf /data/resource-cache/overlays.list
find /data/resource-cache/ -name *QuickstepSwitcherOverlay* -exec rm -rf {} \;
}
unmount_rw_stepdir(){
if [ "$MOUNTPRODUCT" ]; then
is_mounted_rw " /product" || unmount_rw /product
elif [ "$OEM" ];then
is_mounted_rw " /oem" && unmount_rw /oem
is_mounted_rw " /oem/OP" && unmount_rw /oem/OP
fi
}
setvars(){
if [ "$API" == 29 ]; then
SUFFIX="/overlay/QuickstepSwitcherOverlay"
else
SUFFIX="/overlay"
fi
if [ -d "/product/overlay" ]; then
PRODUCT=true
# Yay, magisk supports bind mounting /product now
MAGISK_VER_CODE=$(grep "MAGISK_VER_CODE=" /data/adb/magisk/util_functions.sh | awk -F = '{ print $2 }')
if [ $MAGISK_VER_CODE -ge "20000" ]; then
MOUNTPRODUCT=
STEPDIR=$MODDIR/system/product$SUFFIX
else
if [ $(resetprop ro.build.version.sdk) -ge 29 ]; then
echo "\nMagisk v20 is required for users on Android 10"
echo "Please update Magisk and try again."
exit 1
fi
MOUNTPRODUCT=true
STEPDIR=/product$SUFFIX
is_mounted " /product" || mount /product
is_mounted_rw " /product" || mount_rw /product
fi
elif [ -d /oem/OP ];then
OEM=true
is_mounted " /oem" || mount /oem
is_mounted_rw " /oem" || mount_rw /oem
is_mounted " /oem/OP" || mount /oem/OP
is_mounted_rw " /oem/OP" || mount_rw /oem/OP
STEPDIR=/oem/OP/OPEN_US/overlay/framework
else
PRODUCT=; OEM=; MOUNTPRODUCT=
STEPDIR=$MODDIR/system/vendor$SUFFIX
fi
if [ "$MOUNTPRODUCT" ]; then
is_mounted " /product" || mount /product
is_mounted_rw " /product" || mount_rw /product
elif [ "$OEM" ];then
is_mounted " /oem" || mount /oem
is_mounted_rw " /oem" || mount_rw /oem
is_mounted " /oem/OP" || mount /oem/OP
is_mounted_rw " /oem/OP" || mount_rw /oem/OP
fi
# Assign misc variables
PERMISSIONXMLDIR=$MODDIR/system/etc/permissions
WHITELISTXMLDIR=$MODDIR/system/etc/sysconfig
SYSTEMIZE_TARGET=$MODDIR/system/priv-app
}
switch_providers(){
reset_provider
echo "\nThe overlay will be copied to $STEPDIR..."
# Create needed dirs
while [ ! -d "$STEPDIR" ]; do
setvars
mkdir -p $STEPDIR
done
if [ ! "$1" == "com.android.systemui" ]; then
mkdir -p $SYSTEMIZE_TARGET/QuickSwitch-${1}-${RAND}
mkdir -p $MODDIR/system/etc/permissions
mkdir -p $MODDIR/system/etc/sysconfig
package=`echo $1 | cut -d- -f2-`
sysapk=$(grep "updated-package name=\"$package\"" $xml | grep -o 'codePath=.*$' | cut -d\" -f2)
[ -z $sysapk ] && sysapk=$(grep "package name=\"$package\"" $xml | grep -o 'codePath=.*$' | cut -d\" -f2)
dataapktmp=$(ls /data/app/ | grep $1)
dataapk="/data/app/${dataapktmp}/base.apk"
if [ $dataapk ]; then
origdir="$dataapk"
else
origdir="${sysapk}/.*.apk"
fi
if [ -z $sysapk ] && [ -z $dataapktmp ]; then
echo "\nCould not systemise launcher..."
get_logs
exit 1
fi
cp -rf $origdir \
$SYSTEMIZE_TARGET/QuickSwitch-"${1}"-"${RAND}"/QuickSwitch-"${1}"-"${RAND}".apk
perms=$(aapt d permissions $origdir | grep "uses-permission:" | \
sed -r "s|.*='(.*)'|\1|")
permissions=$(echo "$perms" | \
sed -re "s| ||g; s|^| <permission name=\"|; s|$|\"/>|")
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<permissions>
<privapp-permissions package=\"${1}\">
$permissions
</privapp-permissions>
</permissions>" > $PERMISSIONXMLDIR/privapp-permissions-$1.xml
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<config>
<hidden-api-whitelisted-app package=\"${1}\"/>
</config>" > $WHITELISTXMLDIR/$1-hiddenapi-package-whitelist.xml
fi
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<resources>
<string name=\"config_recentsComponentName\">$1/com.android.quickstep.RecentsActivity</string>
</resources>" > $OVERLAYDIR/overlay/values/strings.xml
if [ $NOBACK ]; then
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<resources>
<dimen name=\"config_backGestureInset\">0dp</dimen>
</resources>" > $OVERLAYDIR/overlay/values/config.xml
else
[ -f $OVERLAYDIR/overlay/values/config.xml ] && rm $OVERLAYDIR/overlay/values/config.xml
fi
aapt p -f -v -M ${OVERLAYDIR}/AndroidManifest.xml \
-I /system/framework/framework-res.apk -S ${OVERLAYDIR}/overlay/ \
-F ${MODDIR}/unsigned.apk &>$MODDIR/logs/aapt.log
if [ "$QNAV" ]; then
aapt p -f -v -M ${NAVOVERLAYDIR}/AndroidManifest.xml \
-I /system/framework/framework-res.apk -S ${NAVOVERLAYDIR}/overlay/ \
-F ${MODDIR}/qnav-unsigned.apk &>>$MODDIR/logs/aapt.log
fi
[ -f $OVERLAYDIR/overlay/values/dimens.xml ] && rm $OVERLAYDIR/overlay/values/dimens.xml
sign ${MODDIR}/unsigned.apk ${MODDIR}/signed.apk
cp -rf ${MODDIR}/signed.apk ${STEPDIR}/QuickstepSwitcherOverlay.apk
[ ! -f ${MODDIR}/signed.apk ] && cp -rf ${MODDIR}/unsigned.apk ${STEPDIR}/QuickstepSwitcherOverlay.apk
rm -rf ${MODDIR}/signed.apk ${MODDIR}/unsigned.apk
[ "$QNAV" ] && cp -rf $MODDIR/qnav-unsigned.apk $MODDIR/system/app/QuickSwitchQNavOverlay.apk
if [ -f ${STEPDIR}/QuickstepSwitcherOverlay.apk ]; then
echo "\nOverlay successfully copied..."
else
echo "\nThe overlay was not copied, please send logs to the developer."
get_logs
exit 1
fi
set_perms $1
}
print_modname() {
# @Skittles9823 made this ascii and is way to proud of it
echo " "
echo " _____ "
echo " __ | | __ "
echo " | || || | "
echo " | || || | "
echo " |__|| ||__| "
echo " |_____| "
echo " QuickSwitch "
echo " "
echo " The Lawnchair Team"
echo " "
}
print_modname
resetprop ro.recents.grid false
echo "ro.recents.grid=false" > $MODDIR/system.prop
for arg in $(echo ${@}); do
args=$(echo $arg | tr '=' ' ')
opt1=$(echo $args | awk '{ print $1 }')
opt2=$(echo $args | awk '{ print $2 }')
case "$opt1" in
--reset) reset_provider
echo "The recents provider has been reset to default."
continue;;
--qnav) echo "Installing Android 10 navigation bar overlay..."
QNAV=true
continue;;
--grid) resetprop ro.recents.grid true
echo "ro.recents.grid=true" > $MODDIR/system.prop
continue;;
--noback) NOBACK=true
continue;;
--ch) switch_providers "$opt2"
continue;;
esac
done
unmount_rw_stepdir
get_logs
echo "\nPlease reboot for changes to take effect."
exec 1>&3
cat $stdoutLOG
exit $?