Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
aa2604c
Added REST side panel for categories, conversations, and transcripts
negentropy-en Mar 2, 2026
1cc3d42
Implement mic source selection, stabilize transcription pipeline, and…
Matias000001 Mar 1, 2026
564a787
Apply dart format
Matias000001 Mar 1, 2026
24a522e
Fix icon color regression in glasses connection button
Matias000001 Mar 1, 2026
ff87552
Fix remaining withValues usages and remove unused import
Matias000001 Mar 1, 2026
e2e0bfc
Fix widget tests and align LandingScreen test expectations
Matias000001 Mar 1, 2026
8e3ceda
FIX: Stabilize logging, refine run.sh output filtering, adjust tests …
Matias000001 Mar 1, 2026
eba7cff
pipeline works without glasses
HorttanainenSami Mar 3, 2026
2efe24e
fix displaying of airesponse
HorttanainenSami Mar 4, 2026
f7b8a3c
remove dead code
HorttanainenSami Mar 5, 2026
1e28857
Update README.md
HorttanainenSami Mar 5, 2026
e77507d
fix: refactor github action
veetimar Mar 9, 2026
f08d38f
fix: more CI refactor
veetimar Mar 9, 2026
d46205b
fix: macos files
veetimar Mar 9, 2026
bd045bd
fix: stop tracking vscode files
veetimar Mar 9, 2026
11bc811
fix: edit comment
veetimar Mar 9, 2026
3f415d1
fix: format
veetimar Mar 9, 2026
86aa9dc
fix: format
veetimar Mar 9, 2026
19d4fad
feat: remove output=none from dart format CI
veetimar Mar 9, 2026
5446638
feat: renovate app startup config
veetimar Mar 9, 2026
807e78d
fix: refactor
veetimar Mar 10, 2026
010bfbf
feat: update readme
veetimar Mar 11, 2026
02debe0
Added REST side panel for categories, conversations, and transcripts
negentropy-en Mar 2, 2026
ae16240
test: improved mocks and expanded landing screen coverage
negentropy-en Mar 16, 2026
4e2b840
fix: prevented repeated phone audio stream init
negentropy-en Mar 16, 2026
2ab8890
feat: stabilized recording flow and injected testable dependencies
negentropy-en Mar 16, 2026
3cb58aa
feat: improved side panel summaries and drawer interactions
negentropy-en Mar 16, 2026
cfe560b
Merge origin/dev into feature/rest-side-panel and resolve conflicts
negentropy-en Mar 17, 2026
c552de1
fix: category selection and calendar integration flow
negentropy-en Mar 17, 2026
872d9e7
fix: Format Dart files
negentropy-en Mar 17, 2026
3309149
fix: side panel color compatibility for CI
negentropy-en Mar 17, 2026
4d1db37
fix: removed duplicate connection state widget tests
negentropy-en Mar 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 5 additions & 14 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<application
android:label="front"
android:name="${applicationName}"
Expand All @@ -21,34 +22,24 @@
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->

<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
</manifest>
72 changes: 72 additions & 0 deletions lib/models/api_models.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Small data models added so that frontend doesn't need to work directly with raw JSON maps.
// These models represent the backend REST response shapes in typed Dart objects.

class Category {
final int id;
final String name;

const Category({
required this.id,
required this.name,
});

factory Category.fromJson(Map<String, dynamic> json) {
return Category(
id: json['id'] as int,
// Defensive parsing to avoid crashing if backend gives null or odd types.
name: (json['name'] ?? '').toString(),
);
}

@override
String toString() => name;
}

class Conversation {
final int id;
final String name;
final String summary;
final int? categoryId;
final DateTime? timestamp;

const Conversation({
required this.id,
required this.name,
required this.summary,
required this.categoryId,
required this.timestamp,
});

factory Conversation.fromJson(Map<String, dynamic> json) {
return Conversation(
id: json['id'] as int,
name: (json['name'] ?? '').toString(),
summary: (json['summary'] ?? '').toString(),
categoryId: json['category_id'] as int?,
// Defensive parsing for nullable timestamp so malformed or missing values don't crash the app or side panel UI
timestamp: json['timestamp'] != null
? DateTime.tryParse(json['timestamp'].toString())
: null,
);
}
}

class ConversationVector {
final int id;
final String text;
final int conversationId;

const ConversationVector({
required this.id,
required this.text,
required this.conversationId,
});

factory ConversationVector.fromJson(Map<String, dynamic> json) {
return ConversationVector(
id: json['id'] as int,
text: (json['text'] ?? '').toString(),
conversationId: json['conversation_id'] as int,
);
}
}
Loading