Sample Header Ad - 728x90

Android Enthusiasts

Q&A for enthusiasts and power users of the Android operating system

Latest Questions

11 votes
0 answers
4153 views
Interact with notification action from ADB Shell
I have an Android(7) phone [also fine if you can provide a solution for Android 10] and a Linux pc. By enabling USB debugging and using the terminal of my pc, I am able to read the notifications of my phone using the command: ```adb shell dumpsys notification --noredact``` Now, there are some notifi...
I have an Android(7) phone [also fine if you can provide a solution for Android 10] and a Linux pc. By enabling USB debugging and using the terminal of my pc, I am able to read the notifications of my phone using the command:
shell dumpsys notification --noredact
Now, there are some notifications in Android in which we can interact with the app directly from the notification. For example, in a WhatsApp notification, there are usually two buttons: *Reply* & *Mark as read*. On YouTube, there are options like *Play, Turn off, Watch later*. In the output of the above command, these options are visible in the following form:
actions={
         "Reply" -> PendingIntent{6becf48: PendingIntentRecord{87b8050 com.whatsapp startService (whitelist: +30s0ms)}}
         "Mark as read" -> PendingIntent{c1661e1: PendingIntentRecord{b8e3249 com.whatsapp startService (whitelist: +30s0ms)}}
      }
I have two questions: 1. Can we interact with these options from adb shell? For example, is there any command like
shell  'Message to be sent in WhatsApp with reply option'
which will send the text as a reply in WhatsApp without opening the app? 2. Is it possible to swipe the notifications using any ADB command? (Not the
shell input swipe x0 y0 x1 y1
, it requires to unlock the phone each time) Thank you in advance! **Edit:** Here is what I found that may be relevant to this question. I think that I have to somehow launch the specific intent linked to the mentioned PendingIntent id (in this case
or
) Using the command
shell dumpsys activity intents > output.txt
and then searching for
in
.txt
, I found the name of the intent. It was as follows:
* PendingIntentRecord{87b8050 com.whatsapp startService (whitelist: +30s0ms)}
    uid=10104 packageName=com.whatsapp type=startService flags=0x0
    requestIntent=act=com.whatsapp.intent.action.DIRECT_REPLY_FROM_MESSAGE dat=content://com.whatsapp.provider.contact/contacts/2256 cmp=com.whatsapp/.notification.DirectReplyService (has extras)
    whitelistDuration=+30s0ms
Now I think that it may be possible to launch the intent
.whatsapp.intent.action.DIRECT_REPLY_FROM_MESSAGE
using
shell am
command, and passing the intent id and message as some parameters. (Just like we can launch WhatsApp from adb with
command, it should be possible to launch the pendingIntent also.) **Edit 2:** Using this command:
adb shell am startservice -a com.whatsapp.intent.action.DIRECT_REPLY_FROM_MESSAGE -d content://com.whatsapp.provider.contact/contacts/2256 -n com.whatsapp/.notification.DirectReplyService --es 'com.whatsapp.Intent.EXTRA_TEXT' 'Hi. Okay.'
The output was as follows:
Starting service: Intent { act=com.whatsapp.intent.action.DIRECT_REPLY_FROM_MESSAGE dat=content://com.whatsapp.provider.contact/contacts/2256 cmp=com.whatsapp/.notification.DirectReplyService (has extras) }
Error: Requires permission not exported from uid 10104
Soham Saha (111 rep)
Oct 25, 2020, 02:22 PM • Last activity: Sep 15, 2025, 10:05 PM
3 votes
2 answers
1387 views
Shell .profile or /etc/profile for old android 2.3.3
Just rooted my old phone with Android 2.3.3 and I would like to define some aliases for each shell I start (with adb or terminal app). I found [this question][1] where one answer says that `/etc/profile` (=`/system/etc/profile` due to soft link `/etc`->`/system/etc`) is one of the files the shell so...
Just rooted my old phone with Android 2.3.3 and I would like to define some aliases for each shell I start (with adb or terminal app). I found this question where one answer says that /etc/profile (=/system/etc/profile due to soft link /etc->/system/etc) is one of the files the shell sources on startup. But this post talks about /system/bin/sh being a link to /system/bin/mksh, which is not the case on my 2.3.3 system. Despite the fact that strings sh produces /etc/profile as one output, the file is not sourced. Does anyone happen to know the old Android version and whether I have a chance to get /etc/profile or some other file sourced on shell startup? I thought it might be a permission problem but even rwxrwxr-x does not help.
Harald (277 rep)
Sep 5, 2015, 12:58 PM • Last activity: Sep 4, 2025, 12:03 AM
19 votes
4 answers
173621 views
Why can't I get root access from shell?
> adb shell sh-4.1$ su Permission denied I have rooted my phone successfully. I know this because I'm able to install apps on SD card and I have a program called [SD Maid][1] that is able to operate with root permissions. [1]: https://play.google.com/store/apps/details?id=eu.thedarken.sdm&hl=en
> adb shell sh-4.1$ su Permission denied I have rooted my phone successfully. I know this because I'm able to install apps on SD card and I have a program called SD Maid that is able to operate with root permissions.
Kshitiz Sharma (489 rep)
Feb 21, 2013, 10:16 AM • Last activity: Jul 29, 2025, 09:37 AM
3 votes
1 answers
12083 views
How to run a script in background from adb shell?
I have a problem with USB tethering on my rooted Nougat phone (LineageOS). After some time phone stops USB tethering. To fix that I run the following script like this: adb shell su nohup sh tether.sh & exit exit tether.sh #!/system/bin/sh service list while true; do if ! pidof -s dnsmasq > /dev/null...
I have a problem with USB tethering on my rooted Nougat phone (LineageOS). After some time phone stops USB tethering. To fix that I run the following script like this: adb shell su nohup sh tether.sh & exit exit tether.sh #!/system/bin/sh service list while true; do if ! pidof -s dnsmasq > /dev/null then echo -n "Connectivity lost at " date -u +%FT%TZ echo "Waiting 3 seconds..." sleep 3 echo "Calling ConnectivityManager.setUsbTethering(false)" service call connectivity 33 i32 0 2>&1 sleep 3 echo "Calling ConnectivityManager.setUsbTethering(true)" service call connectivity 33 i32 1 2>&1 echo "Waiting 3 seconds..." fi sleep 3 done Problem: If I use nohup my call to service call connectivity fails with service not found. And I put service list on top of the script which returns Found 0 services:. However the same commands work when ran directly from adb shell; su. Why service call doesn't work inside this background script? Does it need the same tty to work?
Nazar554 (188 rep)
Aug 27, 2019, 08:33 PM • Last activity: Jun 17, 2025, 06:35 PM
0 votes
0 answers
50 views
Error when logging in as root bash after updating kernel with new Magisk
I want chroot to work. It all happened when I upgraded Magisk and then repatched my kernel. Now that I'm logging in as root bash, I get this error: ``` bash: cannot set terminal process group (6898): Inappropriate ioctl for device bash: no job control in this shell ``` Then, if I press ^C, all comma...
I want chroot to work. It all happened when I upgraded Magisk and then repatched my kernel. Now that I'm logging in as root bash, I get this error:
bash: cannot set terminal process group (6898): Inappropriate ioctl for device
bash: no job control in this shell
Then, if I press ^C, all commands are not working and the shell exits with **signal number 2**. How do I fix this?
Yare yare daze (1 rep)
May 15, 2025, 08:14 PM • Last activity: May 17, 2025, 05:44 AM
1 votes
1 answers
632 views
ADB SU root inputs location
Where do I enter the commands for SU abilities and root access or settings? ``` fd = open("/system/file.txt", O_RDWR | O_LARGEFILE | O_NONBLOCK); if (fd Code source: https://android.stackexchange.com/q/213631 No, I'm not doing this for any reason, and I don't need to throw an explanation at all. I'm...
Where do I enter the commands for SU abilities and root access or settings? ``` fd = open("/system/file.txt", O_RDWR | O_LARGEFILE | O_NONBLOCK); if (fd Code source: https://android.stackexchange.com/q/213631 No, I'm not doing this for any reason, and I don't need to throw an explanation at all. I'm just tooling around and I'm trying to learn on my own as well as reading and doing my own research, so please spare me the whys, the whats, and the whos, and just explain to me where I enter these commands.
W K. Omni (11 rep)
Jun 30, 2024, 01:31 PM • Last activity: May 10, 2025, 11:01 AM
1 votes
1 answers
1173 views
What are system/secure/global namespaces about?
In the `settings` command (i.e. which invokes `cmd` command), there are 3 namespaces: * `system` * `secure` * `global` What are these, and why are some features on one rather than another?
In the settings command (i.e. which invokes cmd command), there are 3 namespaces: * system * secure * global What are these, and why are some features on one rather than another?
user301378
Jul 24, 2019, 02:31 PM • Last activity: Apr 5, 2025, 04:13 PM
35 votes
1 answers
226292 views
adb shell -> su: not found
[![enter image description here][1]][1] [1]: https://i.sstatic.net/kMkc0.jpg How can I overcome this problem? Devices: 1. Samsung Galaxy TabS - Android 4.4.2 2. HTC M8 - Android 5.0.1 The two devices have the same problem.
enter image description here How can I overcome this problem? Devices: 1. Samsung Galaxy TabS - Android 4.4.2 2. HTC M8 - Android 5.0.1 The two devices have the same problem.
mcxxx (461 rep)
Nov 3, 2015, 12:07 PM • Last activity: Jan 31, 2025, 07:25 PM
3 votes
1 answers
566 views
What shells does AOSP include by default?
As an example, I am certain that it includes `sh` in `$PATH` somewhere (presumably `/system/bin/sh`), but does it include any alternatives by default, too, like `bash` (even outside of `$PATH`)?
As an example, I am certain that it includes sh in $PATH somewhere (presumably /system/bin/sh), but does it include any alternatives by default, too, like bash (even outside of $PATH)?
RokeJulianLockhart (577 rep)
Jan 30, 2025, 10:24 PM • Last activity: Jan 31, 2025, 09:02 AM
0 votes
2 answers
4275 views
Is it possible to make multiple adb commands a one-liner command? (case change bootanimation.zip)
Is it possible to make the following commands a one-liner command ? to change bootanimation.zip quickly and gain some C:\Users\User\Desktop>adb push bootanimation /sdcard C:\Users\User\Desktop>adb shell $ su # mount -o rw,remount /system # cp /sdcard/bootanimation.zip /system/media/bootanimation.zip...
Is it possible to make the following commands a one-liner command ? to change bootanimation.zip quickly and gain some C:\Users\User\Desktop>adb push bootanimation /sdcard C:\Users\User\Desktop>adb shell $ su # mount -o rw,remount /system # cp /sdcard/bootanimation.zip /system/media/bootanimation.zip # chmod 644 /system/media/bootanimation.zip # reboot
M. A. (840 rep)
Jun 18, 2019, 02:28 PM • Last activity: Jan 25, 2025, 03:20 AM
0 votes
0 answers
31 views
How to find and download a specific APK (com.android.calculator2) from a FAW device?
Device in question is a FAW (Full Android Watch): a watch running a full Android OS, not WearOS. It is a LEMFO LEMP running Android 9.1, and I'd like to give the calculator I have to another member of the FAW community: https://discourse.fullandroidwatch.org/t/round-calculator-from-faw-app-store/732...
Device in question is a FAW (Full Android Watch): a watch running a full Android OS, not WearOS. It is a LEMFO LEMP running Android 9.1, and I'd like to give the calculator I have to another member of the FAW community: https://discourse.fullandroidwatch.org/t/round-calculator-from-faw-app-store/73203/11 I connected to the watch via USB tether. I started the calculator app and then I opened an adb shell and browsed a ps:
DMN_C16_TFT_PIX64:/data $ ps -A | grep calc                                                                                                                                                                                                 
u0_a52        4132   291 3957800 106124 0                   0 S com.android.calculator2
Based on this I'm hunting for the apk com.android.calculator2. I browsed the file system with Device Explorer in Android Studio. I've found this: enter image description here First, it looks like to be a directory. If I double click to step into that directory: enter image description here In any case if I try to download it, I get an error. enter image description here
DMN_C16_TFT_PIX64:/ $ pwd
/
DMN_C16_TFT_PIX64:/ $ cd data
DMN_C16_TFT_PIX64:/data $ ls -al
ls: .: Permission denied
Where is that apk and how can I download it?
Csaba Toth (161 rep)
Dec 28, 2024, 10:59 PM
1 votes
1 answers
242 views
Termux Running easyrsa as `sudo -u root` gives me No such file or directory
I'm trying to run a sh script (easyrsa) while being in `sudo -u root` environment. sudo -u root sh /data/data/com.termux/files/home/openvpn/easy-rsa/easyrsa3/easyrsa This gives me an error telling me that OpenSSL is not present (I assume because I'm running it in a different environment) And when I...
I'm trying to run a sh script (easyrsa) while being in sudo -u root environment. sudo -u root sh /data/data/com.termux/files/home/openvpn/easy-rsa/easyrsa3/easyrsa This gives me an error telling me that OpenSSL is not present (I assume because I'm running it in a different environment) And when I try sudo -u root /data/data/com.termux/files/home/openvpn/easy-rsa/easyrsa3/easyrsa It gives me "No such file or directory". I tried every possible combination of commands but just can't seem to get it right. The main issue is I'm trying to run easyrsa from a web dashboard for generating certificates, and this dashboard is running as sudo -u root and for some strange reason, it just can't find the files in termux home. /data/data/com.termux/files/home/openvpn/easy-rsa/easyrsa3/easyrsa is my location of the easyrsa shell file
xMidNight-. (21 rep)
Dec 18, 2024, 10:14 PM • Last activity: Dec 20, 2024, 03:38 AM
0 votes
1 answers
4835 views
`adb shell` returns with error: closed
I somehow bricked my OnePlus One phone badly. It only loads directly to the recovery. Pressing vol up + power button or rebooting it with `adb reboot bootloader` doesn't get me to the bootloader. I think I erased the bootloader partition or deleted my bootloader. Here comes the tricky part. I can't...
I somehow bricked my OnePlus One phone badly. It only loads directly to the recovery. Pressing vol up + power button or rebooting it with adb reboot bootloader doesn't get me to the bootloader. I think I erased the bootloader partition or deleted my bootloader. Here comes the tricky part. I can't even sideload any file or access my internal SD card because then I get either following error messages: - E: footer is wrong - E: signature verification failed - Error opening '/data/media' (no such file or directory) Right now I can either flash the OnePlusRestoreTool(64GB) recovery or the ColorOS recovery tool (both can't access the internal storage - button is not clickable). I thought I just have to mount my SD card new, but I can't enter a shell command, and most badly, I can't enter the bootloader. How to fix it?
user244972 (1 rep)
Nov 26, 2017, 06:28 PM • Last activity: Dec 19, 2024, 12:03 AM
0 votes
1 answers
3655 views
How to send SMS from terminal in background on Android?
I'm trying to send text message (SMS) from my Android terminal app in background (sim 1 or 2). I can send message in foreground using this command: ```bash am start -a android.intent.action.SENDTO -d sms:121 --es sms_body "test text" --ez exit_on_sent true; input keyevent 22; input keyevent 66; ```...
I'm trying to send text message (SMS) from my Android terminal app in background (sim 1 or 2). I can send message in foreground using this command:
am start -a android.intent.action.SENDTO -d sms:121 --es sms_body "test text" --ez exit_on_sent true;
input keyevent 22;
input keyevent 66;
But this command don't work in background. So, how can I send message in background from my terminal? **Note: Android version 6.0. Rooted device**
Rabib (1 rep)
Feb 9, 2020, 12:21 PM • Last activity: Dec 13, 2024, 03:02 AM
0 votes
0 answers
213 views
Can't mount anything on a rooted android device: not in /proc/mounts
I have a rooted Samsung Galaxy S23 with Android 14 and Magisk 27 installed. I ran ```adb root``` successfully and then proceeded to go into ```adb shell``` in which I obviously had root rights (#). Then I ran ```mount -o remount,rw /data/adb/service.d``` which gave me the error message ```mount: '/s...
I have a rooted Samsung Galaxy S23 with Android 14 and Magisk 27 installed. I ran
root
successfully and then proceeded to go into
shell
in which I obviously had root rights (#). Then I ran
-o remount,rw /data/adb/service.d
which gave me the error message
: '/service.d' not in /proc/mounts
. This always occurs whenever I try to mount/remount any root directory. How can this be fixed?
MLueh (1 rep)
Sep 30, 2024, 11:30 PM
0 votes
1 answers
214 views
Why does calling setuid() return "Bad system call"?
So actually, I have Android 13. The problem is in my C code (probably?). When I call `setuid(0)` or `setuid(getuid())` in my phone, I get this output: ``` Bad system call ``` Meanwhile on my laptop with Ubuntu, `setuid()` doesn't throw any error, and returns -1 (so that's how it should be). Then why...
So actually, I have Android 13. The problem is in my C code (probably?). When I call setuid(0) or setuid(getuid()) in my phone, I get this output:
Bad system call
Meanwhile on my laptop with Ubuntu, setuid() doesn't throw any error, and returns -1 (so that's how it should be). Then why does Android's setuid() throw that? And if Bad system call is normal for Android, then how can the Android system call setuid() for each Java application (uid 10000 and greater)?
BHms game Java (3 rep)
Sep 6, 2024, 03:09 PM • Last activity: Sep 9, 2024, 02:26 PM
2 votes
2 answers
15734 views
"Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS" when using `adb shell pm grant` command
I have installed a clipboard manager, [Clip Stack][1] on my Android 11 phone. When the app is opened, the developer helpfully gives the message that background clipboard access has been blocked by Android 10 but he has found a workaround and to run the following ADB commands: > ``` > adb -d shell ap...
I have installed a clipboard manager, Clip Stack on my Android 11 phone. When the app is opened, the developer helpfully gives the message that background clipboard access has been blocked by Android 10 but he has found a workaround and to run the following ADB commands: >
> adb -d shell appops set com.catchingnow.tinyclipboardmanager SYSTEM_ALERT_WINDOW allow; 
> adb -d shell pm grant com.catchingnow.tinyclipboardmanager android.permission.READ_LOGS; 
> adb shell am force-stop com.catchingnow.tinyclipboardmanager;
>
I don't want to install Android Studio. I tried the following: 1. Enabled Developer Options on my phone and turned on USB debugging and Allow screen overlaps on settings 2. On my computer installed minimal_adb_fastboot_v1.4.3 3. Connected my phone to my computer via usb 4. Clicked on the desktop shortcut for Minimal ADB and Fastboot to open a cmd window 5. Ran adb -d shell appops set com.catchingnow.tinyclipboardmanager SYSTEM_ALERT_WINDOW allow; The daemon started. 6. Ran adb -d shell pm grant com.catchingnow.tinyclipboardmanager android.permission.READ_LOGS; It gave error:
Exception occurred while executing 'grant':
java.lang.SecurityException: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS.
        at android.app.ContextImpl.enforce(ContextImpl.java:2028)
        at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:2056)
        at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermissionInternal(PermissionManagerService.java:1463)
        at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermission(PermissionManagerService.java:1444)
        at com.android.server.pm.PackageManagerShellCommand.runGrantRevokePermission(PackageManagerShellCommand.java:2300)
        at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:251)
        at android.os.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:98)
        at android.os.ShellCommand.exec(ShellCommand.java:44)
        at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:22307)
        at android.os.Binder.shellCommand(Binder.java:929)
        at android.os.Binder.onTransact(Binder.java:813)
        at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4687)
        at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:4471)
        at android.os.Binder.execTransactInternal(Binder.java:1159)
        at android.os.Binder.execTransact(Binder.java:1123)
How can I proceed?
boardtc (176 rep)
Sep 14, 2021, 10:26 PM • Last activity: Sep 6, 2024, 02:41 PM
3 votes
0 answers
4725 views
Where are my files in the Explorer when I move them in the Secure Folder [SAMSUNG]
When I connect my phone (Samsung) to my computer, I see an image in DCIM\Screenshots. When I enable Secure Folder and move the image there, the image disappears in Windows Explorer. When I look at the path where the image is, it still says DCIM\Screenshots but it's not there. Does anyone know where...
When I connect my phone (Samsung) to my computer, I see an image in DCIM\Screenshots. When I enable Secure Folder and move the image there, the image disappears in Windows Explorer. When I look at the path where the image is, it still says DCIM\Screenshots but it's not there. Does anyone know where these files are stored then? Are they stored somewhere else at all, or are they simply invisible in Explorer? I already installed ADB and enabled USB debugging on the phone. I think it's the path I'm giving. I don't know how to specify the drive in the path, or does it not have to be done? I have already tried these commands: adb shell ls -la /phone/DCIM/Screenshots adb shell ls -la user/phone/DCIM/Screenshots adb shell ls -la "Dieser PC/user/phone/DCIM/Screenshots" Then I get the error twice that the path is not found. Is it because the path contains a space?
Goethe (31 rep)
Sep 21, 2022, 04:21 PM • Last activity: Aug 29, 2024, 08:10 AM
0 votes
0 answers
134 views
How do I bypass ADB Error Message and/or delete OEMs
I have a TCL Android phone. I keep getting error messages when attempting to use ADB to debloat my phone. I would love to know why my commands aren't working and what the correct ones to enter are. I was inputting the following commands First; adb shell pm list users Then these exact commands in any...
I have a TCL Android phone. I keep getting error messages when attempting to use ADB to debloat my phone. I would love to know why my commands aren't working and what the correct ones to enter are. I was inputting the following commands First; adb shell pm list users Then these exact commands in any given order as I have attempted this several times over now;
pm uninstall -k --user 0 com.facebook
pm uninstall -k --user 0 com.facebook.appmanager
pm uninstall -k --user 0 com.facebook.services
pm uninstall -k --user 0 com.facebook.system
These are the error messages which come up in return.
Exception occurred while executing 'uninstall':
java.lang.IllegalArgumentException: Bad user number: com.facebook
	at android.os.UserHandle.parseUserArg(UserHandle.java:489)
	at com.android.server.pm.PackageManagerShellCommand.runUninstall(PackageManagerShellCommand.java:2012)
	at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:234)
	at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)
	at android.os.ShellCommand.exec(ShellCommand.java:38)
	at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:25476)
	at android.os.Binder.shellCommand(Binder.java:950)
	at android.os.Binder.onTransact(Binder.java:834)
	at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:5092)
	at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:8829)
	at android.os.Binder.execTransactInternal(Binder.java:1184)
	at android.os.Binder.execTransact(Binder.java:1143)
I hope my efforts in tracing down those error messages will prove helpful for you. I've found on another post on this website that a quick fix would be to uninstall secure folder. I haven't been able to find any trace of a secure folder on my TCL Android. Nor did I see "disable monitoring permissions" in my dev settings which I had seen written as a quick fix on another post on this website. Any help would be much appreciated I have 32GB to myself on my work and personal phone and the OEMs are taking up 15GBs of those.
TiredTechy (1 rep)
Jul 19, 2024, 06:46 PM • Last activity: Jul 21, 2024, 06:50 AM
68 votes
9 answers
193862 views
How can I run a script on boot?
I'm accustomed to running scripts on boot in Linux, but I'm not sure how to do this in Android. I'd like to start my SSH daemon on start, so I'll always be able to connect. How can I run an arbitrary script on Android boot? It'd be preferable to do this outside of Dalvik.
I'm accustomed to running scripts on boot in Linux, but I'm not sure how to do this in Android. I'd like to start my SSH daemon on start, so I'll always be able to connect. How can I run an arbitrary script on Android boot? It'd be preferable to do this outside of Dalvik.
Naftuli Kay (2662 rep)
Mar 2, 2011, 09:15 PM • Last activity: Jul 17, 2024, 04:27 AM
Showing page 1 of 20 total questions