Skip to content

Commit 897d618

Browse files
committed
Add sample prompts to home screen.
Signed-off-by: Katharine Berry <[email protected]>
1 parent da9ab1d commit 897d618

File tree

7 files changed

+107
-7
lines changed

7 files changed

+107
-7
lines changed

app/package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@
103103
"name": "IMAGE_MENU_ICON",
104104
"type": "bitmap"
105105
},
106+
{
107+
"file": "icons/question_icon.png",
108+
"name": "QUESTION_ICON",
109+
"type": "bitmap"
110+
},
106111
{
107112
"file": "icons/dictation_icon.png",
108113
"name": "DICTATION_ICON",
@@ -218,6 +223,11 @@
218223
"name": "REPORT_BLURB",
219224
"type": "raw"
220225
},
226+
{
227+
"file": "text/sample_prompts.txt",
228+
"name": "SAMPLE_PROMPTS",
229+
"type": "raw"
230+
},
221231
{
222232
"file": "weather/medium/generic.pdc",
223233
"name": "WEATHER_MEDIUM_GENERIC",
1.25 KB
Loading
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
What's the weather like?
2+
Set a baking timer for five minutes.
3+
Will I need an umbrella tomorrow?
4+
At 5pm, remind me to go grocery shopping.
5+
Who was the 22nd president of the United States?
6+
Set an alarm for 11am.
7+
What is 50 dollars in pounds?
8+
How do you say 'good morning' in German?
9+
What is 47 squared?
10+
Where is the nearest bar that's open?
11+
What is the capital of Burkina Faso?
12+
What is the population of Germany?
13+
What is the speed of light?

app/src/c/assistant.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ int main(void) {
5757
if (launch_reason() == APP_LAUNCH_QUICK_LAUNCH) {
5858
QuickLaunchBehaviour quick_launch_behaviour = settings_get_quick_launch_behaviour();
5959
if (quick_launch_behaviour != QuickLaunchBehaviourHomeScreen) {
60-
session_window_push(quick_launch_behaviour == QuickLaunchBehaviourConverseWithTimeout ? QUICK_LAUNCH_TIMEOUT_MS : 0);
60+
session_window_push(quick_launch_behaviour == QuickLaunchBehaviourConverseWithTimeout ? QUICK_LAUNCH_TIMEOUT_MS : 0, NULL);
6161
} else {
6262
s_root_window = root_window_create();
6363
root_window_push(s_root_window);

app/src/c/converse/session_window.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct SessionWindow {
4949
AppTimer *timeout_handle;
5050
ActionMenuLevel *action_menu;
5151
int timeout;
52+
char* starting_prompt;
5253
};
5354

5455
static void prv_window_load(Window *window);
@@ -70,13 +71,17 @@ static void prv_cancel_timeout(SessionWindow* sw);
7071
static void prv_action_menu_query(ActionMenu *action_menu, const ActionMenuItem *action, void *context);
7172
static void prv_action_menu_report_thread(ActionMenu *action_menu, const ActionMenuItem *action, void *context);
7273

73-
void session_window_push(int timeout) {
74+
void session_window_push(int timeout, char *starting_prompt) {
7475
Window *window = window_create();
7576
SessionWindow *sw = malloc(sizeof(SessionWindow));
7677
memset(sw, 0, sizeof(SessionWindow));
7778
window_set_user_data(window, sw);
7879
sw->window = window;
7980
sw->timeout = timeout;
81+
if (starting_prompt != NULL) {
82+
sw->starting_prompt = malloc(strlen(starting_prompt) + 1);
83+
strncpy(sw->starting_prompt, starting_prompt, strlen(starting_prompt) + 1);
84+
}
8085
window_set_window_handlers(window, (WindowHandlers) {
8186
.load = prv_window_load,
8287
.unload = prv_window_unload,
@@ -105,15 +110,17 @@ static void prv_destroy(SessionWindow *sw) {
105110
}
106111
free(sw->segment_layers);
107112
window_destroy(sw->window);
113+
if (sw->starting_prompt) {
114+
free(sw->starting_prompt);
115+
}
108116
free(sw);
109117
}
110118

111119
static void prv_window_load(Window *window) {
112120
Layer* root_layer = window_get_root_layer(window);
113-
bool start_dictation = (bool)window_get_user_data(window);
114121
GSize window_size = layer_get_frame(window_get_root_layer(window)).size;
115122
SessionWindow *sw = window_get_user_data(window);
116-
sw->dictation_pending = start_dictation;
123+
sw->dictation_pending = true;
117124
APP_LOG(APP_LOG_LEVEL_INFO, "created SessionWindow %p.", sw);
118125
sw->manager = conversation_manager_create();
119126
conversation_manager_set_handler(sw->manager, prv_conversation_manager_handler, sw);
@@ -176,6 +183,13 @@ static void prv_window_load(Window *window) {
176183

177184
static void prv_window_appear(Window *window) {
178185
SessionWindow *sw = (SessionWindow *)window_get_user_data(window);
186+
if (sw->starting_prompt) {
187+
conversation_manager_add_input(sw->manager, sw->starting_prompt);
188+
sw->query_time = time(NULL);
189+
free(sw->starting_prompt);
190+
sw->starting_prompt = NULL;
191+
sw->dictation_pending = false;
192+
}
179193
if (sw->dictation_pending) {
180194
sw->dictation_pending = false;
181195
dictation_session_start(sw->dictation);

app/src/c/converse/session_window.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
typedef struct SessionWindow SessionWindow;
2323

24-
void session_window_push(int timeout);
24+
void session_window_push(int timeout, char *starting_prompt);
2525
void session_window_destroy(SessionWindow* window);
2626

2727
#endif

app/src/c/root_window.c

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct RootWindow {
2929
Window* window;
3030
ActionBarLayer* action_bar;
3131
SessionWindow* session_window;
32+
GBitmap* question_icon;
3233
GBitmap* dictation_icon;
3334
GBitmap* more_icon;
3435
TextLayer* time_layer;
@@ -37,6 +38,7 @@ struct RootWindow {
3738
EventHandle event_handle;
3839
char time_string[6];
3940
char version_string[9];
41+
char** sample_prompts;
4042
};
4143

4244
static void prv_window_load(Window* window);
@@ -47,6 +49,9 @@ static void prv_prompt_clicked(ClickRecognizerRef recognizer, void *context);
4749
static void prv_more_clicked(ClickRecognizerRef recognizer, void* context);
4850
static void prv_up_clicked(ClickRecognizerRef recognizer, void *context);
4951
static void prv_time_changed(struct tm *tick_time, TimeUnits time_changed, void *context);
52+
static int prv_load_suggestions(char*** suggestions);
53+
static void prv_action_menu_closed(ActionMenu *action_menu, const ActionMenuItem *performed_action, void *context);
54+
static void prv_suggestion_clicked(ActionMenu *action_menu, const ActionMenuItem *action, void *context);
5055

5156
RootWindow* root_window_create() {
5257
RootWindow* window = malloc(sizeof(RootWindow));
@@ -58,10 +63,12 @@ RootWindow* root_window_create() {
5863
});
5964
GRect bounds = layer_get_bounds(window_get_root_layer(window->window));
6065
window_set_background_color(window->window, COLOR_FALLBACK(ACCENT_COLOUR, GColorWhite));
66+
window->question_icon = gbitmap_create_with_resource(RESOURCE_ID_QUESTION_ICON);
6167
window->dictation_icon = gbitmap_create_with_resource(RESOURCE_ID_DICTATION_ICON);
6268
window->more_icon = gbitmap_create_with_resource(RESOURCE_ID_MORE_ICON);
6369
window->action_bar = action_bar_layer_create();
6470
action_bar_layer_set_context(window->action_bar, window);
71+
action_bar_layer_set_icon(window->action_bar, BUTTON_ID_UP, window->question_icon);
6572
action_bar_layer_set_icon(window->action_bar, BUTTON_ID_SELECT, window->dictation_icon);
6673
action_bar_layer_set_icon(window->action_bar, BUTTON_ID_DOWN, window->more_icon);
6774
window_set_user_data(window->window, window);
@@ -95,6 +102,7 @@ void root_window_push(RootWindow* window) {
95102
void root_window_destroy(RootWindow* window) {
96103
window_destroy(window->window);
97104
action_bar_layer_destroy(window->action_bar);
105+
gbitmap_destroy(window->question_icon);
98106
gbitmap_destroy(window->dictation_icon);
99107
gbitmap_destroy(window->more_icon);
100108
text_layer_destroy(window->time_layer);
@@ -154,13 +162,68 @@ static void prv_click_config_provider(void *context) {
154162

155163
static void prv_up_clicked(ClickRecognizerRef recognizer, void *context) {
156164
RootWindow* rw = context;
157-
talking_horse_layer_set_text(rw->talking_horse_layer, "I'm doing thanks! How help?");
165+
// talking_horse_layer_set_text(rw->talking_horse_layer, "I'm doing thanks! How help?");
166+
char **suggestions;
167+
int count = prv_load_suggestions(&suggestions);
168+
ActionMenuLevel *level = action_menu_level_create(count);
169+
for (int i = 0; i < count; ++i) {
170+
action_menu_level_add_action(level, suggestions[i], prv_suggestion_clicked, rw);
171+
}
172+
ActionMenuConfig config = (ActionMenuConfig) {
173+
.root_level = level,
174+
.colors = {
175+
.background = BRANDED_BACKGROUND_COLOUR,
176+
.foreground = gcolor_legible_over(BRANDED_BACKGROUND_COLOUR),
177+
},
178+
.align = ActionMenuAlignTop,
179+
.context = rw,
180+
.did_close = prv_action_menu_closed,
181+
};
182+
rw->sample_prompts = suggestions;
183+
action_menu_open(&config);
184+
}
185+
186+
static void prv_action_menu_closed(ActionMenu *action_menu, const ActionMenuItem *performed_action, void *context) {
187+
RootWindow* rw = context;
188+
action_menu_hierarchy_destroy(action_menu_get_root_level(action_menu), NULL, NULL);
189+
// memory is allocated for sample_prompts[0], but not the rest of the entries - so just free the first one.
190+
free(rw->sample_prompts[0]);
191+
free(rw->sample_prompts);
192+
}
193+
194+
static void prv_suggestion_clicked(ActionMenu *action_menu, const ActionMenuItem *action, void *context) {
195+
RootWindow* rw = context;
196+
char* suggestion = action_menu_item_get_label(action);
197+
session_window_push(0, suggestion);
158198
}
159199

160200
static void prv_prompt_clicked(ClickRecognizerRef recognizer, void *context) {
161-
session_window_push(0);
201+
session_window_push(0, NULL);
162202
}
163203

164204
static void prv_more_clicked(ClickRecognizerRef recognizer, void* context) {
165205
root_menu_window_push();
166206
}
207+
208+
static int prv_load_suggestions(char*** suggestions) {
209+
ResHandle handle = resource_get_handle(RESOURCE_ID_SAMPLE_PROMPTS);
210+
size_t size = resource_size(handle);
211+
char* buffer = malloc(size);
212+
resource_load(handle, (uint8_t*)buffer, size);
213+
int count = 1;
214+
for (size_t i = 0; i < size; ++i) {
215+
if (buffer[i] == '\n') {
216+
++count;
217+
}
218+
}
219+
*suggestions = malloc(sizeof(char*) * count);
220+
for (int i = 0; i < count; ++i) {
221+
(*suggestions)[i] = buffer;
222+
buffer = strchr(buffer, '\n');
223+
if (buffer) {
224+
*buffer = '\0';
225+
++buffer;
226+
}
227+
}
228+
return count;
229+
}

0 commit comments

Comments
 (0)