428 lines
10 KiB
Markdown
428 lines
10 KiB
Markdown
|
|
# Debugging Browser Phone on Android Tablet
|
||
|
|
|
||
|
|
This guide explains how to debug the Twilio WordPress Plugin browser phone on Android tablets (Samsung and other devices).
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
- Android tablet with Chrome browser
|
||
|
|
- USB cable to connect tablet to computer
|
||
|
|
- Computer with Chrome browser installed
|
||
|
|
- USB debugging enabled on tablet
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 1: Enable USB Debugging on Android Tablet
|
||
|
|
|
||
|
|
### Step 1: Enable Developer Options
|
||
|
|
|
||
|
|
1. Open **Settings** on your Android tablet
|
||
|
|
2. Scroll down to **About tablet** (or **About device**)
|
||
|
|
3. Find **Build number** (may be under "Software information")
|
||
|
|
4. Tap **Build number** 7 times rapidly
|
||
|
|
5. You'll see a message: "You are now a developer!"
|
||
|
|
|
||
|
|
### Step 2: Enable USB Debugging
|
||
|
|
|
||
|
|
1. Go back to **Settings**
|
||
|
|
2. Scroll down to **Developer options** (newly appeared)
|
||
|
|
3. Toggle **Developer options** to ON
|
||
|
|
4. Find **USB debugging** in the list
|
||
|
|
5. Toggle **USB debugging** to ON
|
||
|
|
6. Confirm the prompt if asked
|
||
|
|
|
||
|
|
### Step 3: Trust Your Computer
|
||
|
|
|
||
|
|
1. Connect tablet to computer via USB cable
|
||
|
|
2. Unlock your tablet screen
|
||
|
|
3. A popup will appear: "Allow USB debugging?"
|
||
|
|
4. Check **Always allow from this computer**
|
||
|
|
5. Tap **OK** or **Allow**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 2: Connect Chrome DevTools
|
||
|
|
|
||
|
|
### On Your Computer
|
||
|
|
|
||
|
|
1. Open **Chrome browser** on your computer
|
||
|
|
2. Navigate to: `chrome://inspect`
|
||
|
|
3. You should see your tablet device listed under "Remote Target"
|
||
|
|
4. Wait a few seconds for the device to appear
|
||
|
|
|
||
|
|
### Inspect the Browser Phone Page
|
||
|
|
|
||
|
|
1. On your tablet, open Chrome and navigate to:
|
||
|
|
```
|
||
|
|
https://phone.cloud-hosting.io/wp-admin/admin.php?page=twilio-wp-browser-phone
|
||
|
|
```
|
||
|
|
2. On your computer's Chrome DevTools (`chrome://inspect`), you'll see the page listed
|
||
|
|
3. Click **inspect** next to the browser phone page
|
||
|
|
4. A DevTools window will open showing your tablet's browser
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 3: Debug Browser Phone Issues
|
||
|
|
|
||
|
|
### Check Console Logs
|
||
|
|
|
||
|
|
In the **Console** tab, look for key messages:
|
||
|
|
|
||
|
|
#### Successful Connection
|
||
|
|
```
|
||
|
|
Twilio SDK loaded successfully
|
||
|
|
Setting up Twilio Device...
|
||
|
|
Device detection - Android: true, Mobile: true
|
||
|
|
AudioContext created, state: running
|
||
|
|
Device registered successfully
|
||
|
|
Device connection state: connected
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Connection Issues
|
||
|
|
```
|
||
|
|
Device not connected, state: disconnected
|
||
|
|
Failed to register device
|
||
|
|
Connection error: 31005
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Call Issues
|
||
|
|
```
|
||
|
|
Answer button clicked
|
||
|
|
Device connection state: connected
|
||
|
|
Accepting call...
|
||
|
|
Call accepted and connected
|
||
|
|
```
|
||
|
|
|
||
|
|
### Monitor Network Requests
|
||
|
|
|
||
|
|
1. Switch to **Network** tab in DevTools
|
||
|
|
2. Filter by: `twp_` or `twilio`
|
||
|
|
3. Check for failed requests (red status codes)
|
||
|
|
4. Look for:
|
||
|
|
- `twp_generate_capability_token` - Should return 200
|
||
|
|
- `twp_get_phone_numbers` - Should return 200
|
||
|
|
- WebSocket connections to Twilio
|
||
|
|
|
||
|
|
### Check Device Registration
|
||
|
|
|
||
|
|
In the **Console** tab, type:
|
||
|
|
```javascript
|
||
|
|
device
|
||
|
|
```
|
||
|
|
This shows the current Twilio Device object. Check:
|
||
|
|
- `device.state` - Should be "registered"
|
||
|
|
- `device.token` - Should exist (long string)
|
||
|
|
|
||
|
|
### Check AudioContext State
|
||
|
|
|
||
|
|
In the **Console** tab, type:
|
||
|
|
```javascript
|
||
|
|
audioContext
|
||
|
|
```
|
||
|
|
Check:
|
||
|
|
- Should exist (not null)
|
||
|
|
- `audioContext.state` - Should be "running" (not "suspended")
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 4: Common Issues & Solutions
|
||
|
|
|
||
|
|
### Issue 1: "Device not connected" Error
|
||
|
|
|
||
|
|
**Symptoms**: Status shows "Disconnected", calls hang up immediately
|
||
|
|
|
||
|
|
**Debugging**:
|
||
|
|
```javascript
|
||
|
|
// In console, check:
|
||
|
|
deviceConnectionState
|
||
|
|
// Should be: "connected"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Check network connection (try WiFi vs cellular)
|
||
|
|
2. Refresh the page with cache cleared
|
||
|
|
3. Check console for token errors
|
||
|
|
4. Verify Twilio credentials in plugin settings
|
||
|
|
|
||
|
|
### Issue 2: Call Hangs Up Immediately When Answered
|
||
|
|
|
||
|
|
**Symptoms**: Click "Answer" button, call disconnects instantly
|
||
|
|
|
||
|
|
**Debugging**:
|
||
|
|
```javascript
|
||
|
|
// Check device state before answering:
|
||
|
|
deviceConnectionState
|
||
|
|
// Check for errors in call handler
|
||
|
|
```
|
||
|
|
|
||
|
|
**Look for console errors**:
|
||
|
|
- `31005` - Connection/network error
|
||
|
|
- `31201` - ICE connection failure
|
||
|
|
- `31208` - Media connection error
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Grant microphone permissions (Settings > Site settings > Microphone)
|
||
|
|
2. Check AudioContext is running: `audioContext.state`
|
||
|
|
3. Try switching between WiFi and cellular data
|
||
|
|
4. Clear Chrome cache and reload
|
||
|
|
|
||
|
|
### Issue 3: No Sound/Ringtone on Incoming Call
|
||
|
|
|
||
|
|
**Symptoms**: Call arrives but no audio plays, no vibration
|
||
|
|
|
||
|
|
**Debugging**:
|
||
|
|
```javascript
|
||
|
|
// Check audio setup:
|
||
|
|
ringtoneAudio
|
||
|
|
audioContext.state
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Tap screen to unlock AudioContext (mobile restriction)
|
||
|
|
2. Check if ringtone file exists (optional, vibration is fallback)
|
||
|
|
3. Verify device supports Vibration API: `'vibrate' in navigator`
|
||
|
|
4. Check browser volume settings
|
||
|
|
|
||
|
|
### Issue 4: No Browser Notifications
|
||
|
|
|
||
|
|
**Symptoms**: No notification when call arrives in background
|
||
|
|
|
||
|
|
**Debugging**:
|
||
|
|
```javascript
|
||
|
|
// Check notification permission:
|
||
|
|
Notification.permission
|
||
|
|
// Should be: "granted"
|
||
|
|
|
||
|
|
// Check service worker:
|
||
|
|
navigator.serviceWorker.controller
|
||
|
|
// Should exist
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Grant notification permission: Settings > Site settings > Notifications
|
||
|
|
2. Check service worker registration in **Application** tab of DevTools
|
||
|
|
3. Look for service worker logs in console
|
||
|
|
4. Reinstall PWA if installed
|
||
|
|
|
||
|
|
### Issue 5: Microphone Permission Denied
|
||
|
|
|
||
|
|
**Symptoms**: Error message about microphone access
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Chrome Settings > Site settings > Microphone
|
||
|
|
2. Find `phone.cloud-hosting.io`
|
||
|
|
3. Change permission to **Allow**
|
||
|
|
4. Refresh the browser phone page
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 5: Tablet-Specific Checks
|
||
|
|
|
||
|
|
### Check User Agent
|
||
|
|
|
||
|
|
In console:
|
||
|
|
```javascript
|
||
|
|
navigator.userAgent
|
||
|
|
```
|
||
|
|
Should include "Android" and "Chrome"
|
||
|
|
|
||
|
|
### Check WebRTC Support
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// Check getUserMedia support:
|
||
|
|
navigator.mediaDevices.getUserMedia
|
||
|
|
// Should be: function
|
||
|
|
|
||
|
|
// Check Notification support:
|
||
|
|
'Notification' in window
|
||
|
|
// Should be: true
|
||
|
|
|
||
|
|
// Check Service Worker support:
|
||
|
|
'serviceWorker' in navigator
|
||
|
|
// Should be: true
|
||
|
|
```
|
||
|
|
|
||
|
|
### Check Audio Constraints
|
||
|
|
|
||
|
|
Look in console for:
|
||
|
|
```
|
||
|
|
Twilio Device created with audio constraints: {
|
||
|
|
echoCancellation: true,
|
||
|
|
noiseSuppression: true,
|
||
|
|
autoGainControl: true,
|
||
|
|
googEchoCancellation: true,
|
||
|
|
...
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Test Vibration
|
||
|
|
|
||
|
|
In console:
|
||
|
|
```javascript
|
||
|
|
navigator.vibrate([300, 200, 300])
|
||
|
|
```
|
||
|
|
Tablet should vibrate if supported.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 6: Advanced Debugging
|
||
|
|
|
||
|
|
### Monitor Twilio Device Events
|
||
|
|
|
||
|
|
In console, add event listeners:
|
||
|
|
```javascript
|
||
|
|
device.on('registered', () => console.log('Device registered!'));
|
||
|
|
device.on('error', (error) => console.error('Device error:', error));
|
||
|
|
device.on('incoming', (call) => console.log('Incoming call:', call));
|
||
|
|
device.on('unregistered', () => console.log('Device unregistered'));
|
||
|
|
```
|
||
|
|
|
||
|
|
### Check Call State During Active Call
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// When in a call:
|
||
|
|
currentCall
|
||
|
|
currentCall.status()
|
||
|
|
currentCall.parameters
|
||
|
|
```
|
||
|
|
|
||
|
|
### Test Audio Context Resume
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// Try to resume manually:
|
||
|
|
audioContext.resume().then(() => {
|
||
|
|
console.log('AudioContext state:', audioContext.state);
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
### Check Token Expiry
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// See when token expires:
|
||
|
|
new Date(tokenExpiry)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 7: Logging Important Information
|
||
|
|
|
||
|
|
### Collect Debugging Info
|
||
|
|
|
||
|
|
Run this in console to get a debug report:
|
||
|
|
```javascript
|
||
|
|
console.log('=== Browser Phone Debug Report ===');
|
||
|
|
console.log('User Agent:', navigator.userAgent);
|
||
|
|
console.log('Device State:', deviceConnectionState);
|
||
|
|
console.log('Device Registered:', device ? device.state : 'no device');
|
||
|
|
console.log('AudioContext:', audioContext ? audioContext.state : 'no context');
|
||
|
|
console.log('Notification Permission:', Notification.permission);
|
||
|
|
console.log('Service Worker:', navigator.serviceWorker.controller ? 'active' : 'inactive');
|
||
|
|
console.log('Current Call:', currentCall ? 'in call' : 'no call');
|
||
|
|
console.log('Token Expiry:', tokenExpiry ? new Date(tokenExpiry) : 'unknown');
|
||
|
|
```
|
||
|
|
|
||
|
|
### Check WordPress AJAX Responses
|
||
|
|
|
||
|
|
In **Network** tab:
|
||
|
|
1. Filter: `admin-ajax.php`
|
||
|
|
2. Click on request
|
||
|
|
3. Check **Preview** tab for response
|
||
|
|
4. Look for `success: true` or error messages
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Part 8: Testing Checklist
|
||
|
|
|
||
|
|
After fixing issues, test these scenarios:
|
||
|
|
|
||
|
|
- [ ] Device shows "Connected" status
|
||
|
|
- [ ] Can make outbound call successfully
|
||
|
|
- [ ] Can receive incoming call (see notification)
|
||
|
|
- [ ] Can answer incoming call without hang-up
|
||
|
|
- [ ] Ringtone plays or tablet vibrates
|
||
|
|
- [ ] Call audio is clear (echo cancellation working)
|
||
|
|
- [ ] Can switch between WiFi and cellular during call
|
||
|
|
- [ ] Browser notification appears when app in background
|
||
|
|
- [ ] Service worker logs appear in console
|
||
|
|
- [ ] No errors in console during call lifecycle
|
||
|
|
- [ ] Can put call on hold
|
||
|
|
- [ ] Can transfer call
|
||
|
|
- [ ] Call timer updates correctly
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting Specific Error Codes
|
||
|
|
|
||
|
|
### Twilio Error 31005
|
||
|
|
**Meaning**: WebSocket connection failed
|
||
|
|
|
||
|
|
**Causes**:
|
||
|
|
- Network connectivity issues
|
||
|
|
- Firewall blocking WebSocket
|
||
|
|
- Mobile network switching (WiFi ↔ cellular)
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
- Check internet connection
|
||
|
|
- Try different network
|
||
|
|
- Wait for ICE restart (enabled in config)
|
||
|
|
|
||
|
|
### Twilio Error 31201
|
||
|
|
**Meaning**: ICE connection failed
|
||
|
|
|
||
|
|
**Causes**:
|
||
|
|
- Restrictive NAT/firewall
|
||
|
|
- Mobile network issues
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
- Try different network
|
||
|
|
- Check WebRTC connectivity
|
||
|
|
- Enable mobile data if on WiFi only
|
||
|
|
|
||
|
|
### Twilio Error 31204
|
||
|
|
**Meaning**: Connection error
|
||
|
|
|
||
|
|
**Causes**:
|
||
|
|
- Media connection setup failed
|
||
|
|
- Signaling timeout
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
- Refresh page
|
||
|
|
- Check microphone permissions
|
||
|
|
- Verify audio constraints applied
|
||
|
|
|
||
|
|
### Twilio Error 31208
|
||
|
|
**Meaning**: Media connection failed
|
||
|
|
|
||
|
|
**Causes**:
|
||
|
|
- Microphone access denied
|
||
|
|
- Audio device issues
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
- Grant microphone permission
|
||
|
|
- Check device audio settings
|
||
|
|
- Restart browser
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Additional Resources
|
||
|
|
|
||
|
|
- Twilio Voice SDK Errors: https://www.twilio.com/docs/voice/sdks/javascript/errors
|
||
|
|
- Chrome DevTools Remote Debugging: https://developer.chrome.com/docs/devtools/remote-debugging/
|
||
|
|
- WebRTC Troubleshooting: https://webrtc.github.io/samples/
|
||
|
|
- Service Worker Debugging: https://developer.chrome.com/docs/workbox/
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Contact & Support
|
||
|
|
|
||
|
|
If issues persist after following this guide:
|
||
|
|
|
||
|
|
1. Collect debug report (see Part 7)
|
||
|
|
2. Take screenshots of console errors
|
||
|
|
3. Note tablet model and Android version
|
||
|
|
4. Report issue with collected information
|
||
|
|
|
||
|
|
**Important Files**:
|
||
|
|
- Browser phone implementation: `admin/class-twp-admin.php` (lines 7400-8300)
|
||
|
|
- Service worker: `assets/js/twp-service-worker.js`
|
||
|
|
- CLAUDE.md: Quick reference guide
|