# DailyNotification Plugin Detection Guide

**Author**: Matthew Raymer  
**Date**: October 17, 2025  
**Version**: 1.0.0

## Overview

This guide documents the plugin detection system for the DailyNotification Capacitor plugin, including troubleshooting steps and build process requirements.

## Table of Contents

1. [Plugin Detection Architecture](#plugin-detection-architecture)
2. [Build Process Requirements](#build-process-requirements)
3. [Troubleshooting Guide](#troubleshooting-guide)
4. [Development Workflow](#development-workflow)
5. [Common Issues and Solutions](#common-issues-and-solutions)

## Plugin Detection Architecture

### Native Side (Android)

The DailyNotification plugin is registered on the native Android side through:

1. **Automatic Discovery**: Using Capacitor's annotation processor
2. **Manual Registration**: Fallback in `MainActivity.onCreate()`
3. **Plugin Class**: `org.timesafari.dailynotification.DailyNotificationPlugin`

### JavaScript Side (WebView)

The JavaScript layer detects plugins through:

1. **`capacitor.plugins.json`**: Bridge file that lists available plugins
2. **Capacitor.Plugins Object**: Runtime plugin registry
3. **Plugin Detection Logic**: Checks both sources for availability

### Key Files

```
android/
├── app/src/main/assets/capacitor.plugins.json  # Plugin registry
├── app/src/main/java/.../MainActivity.java     # Plugin registration
└── dailynotification/build.gradle              # Annotation processor

src/
├── views/HomeView.vue                          # Plugin detection UI
└── components/cards/ActionCard.vue             # Interactive components
```

## Build Process Requirements

### Prerequisites

1. **Annotation Processor**: Must be configured in both app and plugin modules
2. **Post-Sync Script**: Required to maintain `capacitor.plugins.json`
3. **Proper Dependencies**: Capacitor Android and plugin modules

### Required Build Steps

```bash
# 1. Build web assets
npm run build

# 2. Sync with native projects
npx cap sync android

# 3. Fix plugin registry (CRITICAL)
node scripts/fix-capacitor-plugins.js

# 4. Build and deploy Android app
cd android
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n org.timesafari.dailynotification.test/.MainActivity
```

### Why the Fix Script is Required

**Problem**: `npx cap sync android` overwrites `capacitor.plugins.json` and doesn't include custom plugins.

**Solution**: Post-sync script automatically restores the DailyNotification plugin entry.

**File**: `scripts/fix-capacitor-plugins.js`

```javascript
const PLUGIN_ENTRY = {
  name: "DailyNotification",
  classpath: "org.timesafari.dailynotification.DailyNotificationPlugin"
};
```

## Troubleshooting Guide

### Issue: "Plugin: Not Available" in System Status

**Symptoms**:
- System Status card shows red "Not Available" indicator
- Plugin Diagnostics shows "Plugin Available: No"

**Diagnosis Steps**:
1. Check `capacitor.plugins.json` content
2. Verify native plugin registration logs
3. Test JavaScript detection logic

**Solutions**:
```bash
# Check plugin registry
cat android/app/src/main/assets/capacitor.plugins.json

# Should contain:
[
  {
    "name": "DailyNotification",
    "classpath": "org.timesafari.dailynotification.DailyNotificationPlugin"
  }
]

# If empty or missing, run fix script
node scripts/fix-capacitor-plugins.js
```

### Issue: Click Events Not Working

**Symptoms**:
- ActionCard buttons don't respond to clicks
- No console logs from click handlers

**Common Causes**:
1. **Wrong View Component**: Router pointing to simplified view
2. **Vue 3 Compatibility**: Using deprecated `@click.native`
3. **Component Registration**: Missing component imports

**Solutions**:
```vue
<!-- ❌ Wrong: Vue 3 doesn't support .native -->
<ActionCard @click.native="handler" />

<!-- ✅ Correct: Standard event binding -->
<ActionCard @click="handler" />
```

### Issue: Empty capacitor.plugins.json After Build

**Symptoms**:
- File contains only `[]`
- Plugin detection fails
- "Simplified dialog" appears

**Root Cause**: `npx cap sync` overwrites the file

**Solution**: Always run fix script after sync
```bash
npm run cap:sync
# Or manually:
npx cap sync android && node scripts/fix-capacitor-plugins.js
```

## Development Workflow

### Daily Development Cycle

1. **Make Changes**: Edit Vue components, native code, or plugin logic
2. **Build Web**: `npm run build`
3. **Sync Native**: `npm run cap:sync` (automatically fixes plugin paths)
4. **Build Android**: `cd android && ./gradlew :app:assembleDebug`
6. **Deploy**: `adb install -r app/build/outputs/apk/debug/app-debug.apk`
7. **Test**: Launch app and verify plugin detection

### Automated Build Script

Create `scripts/build-and-deploy.sh`:

```bash
#!/bin/bash
set -e

echo "🔨 Building web assets..."
npm run build

echo "🔄 Syncing with native projects..."
npx cap sync android

echo "🔧 Fixing plugin registry..."
node scripts/fix-capacitor-plugins.js

echo "🏗️ Building Android app..."
cd android
./gradlew :app:assembleDebug

echo "📱 Installing and launching..."
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n org.timesafari.dailynotification.test/.MainActivity

echo "✅ Build and deploy complete!"
```

### Verification Checklist

After each build, verify:

- [ ] `capacitor.plugins.json` contains DailyNotification entry
- [ ] System Status shows "Plugin: Available" (green)
- [ ] Plugin Diagnostics shows all 4 plugins
- [ ] Click events work on ActionCard components
- [ ] No "simplified dialog" appears
- [ ] Console logs show plugin detection success

## Common Issues and Solutions

### Issue: Annotation Processor Not Working

**Symptoms**: Plugin not auto-discovered, manual registration required

**Solution**: Ensure annotation processor is configured in both modules

```gradle
// app/build.gradle
dependencies {
    annotationProcessor project(':capacitor-android')
}

// dailynotification/build.gradle  
dependencies {
    annotationProcessor project(':capacitor-android')
}
```

### Issue: Plugin Loads But Methods Fail

**Symptoms**: Plugin detected but `checkStatus()` throws errors

**Diagnosis**: Check native plugin implementation and permissions

**Solution**: Verify plugin class methods and Android permissions

### Issue: Inconsistent Status Between Cards

**Symptoms**: System Status shows "Not Available" but Plugin Diagnostics shows "Available"

**Root Cause**: Different detection logic between functions

**Solution**: Use consistent detection method (see `checkSystemStatus` in HomeView.vue)

### Issue: Build Failures After Changes

**Symptoms**: Gradle build errors, TypeScript compilation failures

**Common Causes**:
1. Missing imports after refactoring
2. TypeScript errors in Vue components
3. Gradle dependency conflicts

**Solution**: Check build logs and fix compilation errors

## Debugging Tools

### Console Logging

The app includes comprehensive logging for plugin detection:

```javascript
// Plugin detection logs
console.log('🔍 Plugin detection debug:')
console.log('  - window.DailyNotification:', (window as any).DailyNotification)
console.log('  - Capacitor.Plugins:', (window as any).Capacitor?.Plugins)
console.log('  - Available plugins:', Object.keys((window as any).Capacitor?.Plugins || {}))
```

### ADB Logging

Monitor native Android logs:

```bash
adb logcat | grep -i "dailynotification\|capacitor\|plugin\|error"
```

### Plugin Diagnostics

Use the built-in Plugin Diagnostics feature to get comprehensive system information:

1. Click "Plugin Diagnostics" button
2. Review detailed plugin report
3. Check all available plugins list
4. Verify plugin status and capabilities

## Best Practices

### Development

1. **Always run fix script** after `npx cap sync`
2. **Test plugin detection** after each build
3. **Use consistent detection logic** across components
4. **Monitor console logs** for debugging information
5. **Verify both native and JavaScript sides** work correctly

### Maintenance

1. **Keep fix script updated** if plugin classpath changes
2. **Document any new plugin dependencies**
3. **Update this guide** when architecture changes
4. **Test on multiple devices** and Android versions
5. **Monitor Capacitor updates** for breaking changes

## Related Files

- `scripts/fix-capacitor-plugins.js` - Post-sync plugin registry fix
- `src/views/HomeView.vue` - Main plugin detection UI
- `src/components/cards/ActionCard.vue` - Interactive components
- `android/app/src/main/assets/capacitor.plugins.json` - Plugin registry
- `android/app/src/main/java/.../MainActivity.java` - Native registration

## Support

For issues not covered in this guide:

1. Check Capacitor documentation
2. Review Android plugin development guides
3. Examine console logs and ADB output
4. Test with minimal reproduction case
5. Consult development team

---

**Last Updated**: October 17, 2025  
**Next Review**: After major Capacitor updates or architecture changes
