eletrotupi / tcc/ monografia/chapters/development.texmaster
15.2 KB | 321 lines Raw
1
\chapter{Desenvolvimento}
2

3
Este capítulo detalha o funcionamento de algumas funcionalidades
4
desenvolvidas durante o projeto. Apenas algumas funcionalidades mais
5
chaves são abordadas neste capítulo, como o registro de humor, vinculo
6
de um gatilho, indicadores, e o registro de atividades.
7

8
\section{Processo de Login}
9

10
Logo ao abrir o aplicativo, o usuário é redirecionado para a tela de
11
login. A tela em si é relativamente simples, e contém os campos de
12
email e senha. Existe aqui um elemento proposital: uma forma de
13
garantir um certo nível de anonimato, em que o usuário não precisa se
14
identificar com um nome ou número de telefone, tampouco ativar a conta
15
através de uma plataforma de terceiro, como Google ou Facebook.
16

17
Isso se dá, em especial, por dois motivos. Primeiro, o uso de OAuth
18
exigiria uma conexão com plataformas de terceiro, que poderiam então
19
rastrear quais usuários têm acesso a qual aplicativo — algo que é
20
fartamente documentado na literatura sobre os mecanismos usados por
21
tais plataformas para rastrear e monitorar o acesso a dados de
22
usuários, com o fim de vender e monetizar essas informações.
23

24
Essa preocupação não é hipotética: um estudo que interceptou o tráfego de rede de
25
36 dos aplicativos mais populares de saúde mental (depressão e cessação de
26
tabagismo) encontrou transmissão de dados a pelo menos um terceiro em 92\% deles,
27
sendo que 81\% enviavam dados especificamente a serviços operados por Google ou
28
Facebook — e apenas 59\% desses casos declaravam esse compartilhamento em política
29
de privacidade \cite{Huckvale2019}.
30

31
Um estudo posterior, focado exclusivamente em 27 aplicativos de saúde
32
mental mais populares da Google Play Store, confirmou o mesmo padrão e
33
o caracterizou formalmente como uma ameaça de \textit{linkability}
34
(vinculabilidade) e \textit{identifiability} (identificabilidade): mesmo quando os
35
identificadores enviados a terceiros são pseudônimos (como \textit{advertising IDs}
36
ou hashes), eles ainda permitem que provedores de publicidade associem o
37
comportamento de um usuário através de diferentes aplicativos e serviços
38
\cite{Iwaya:22}. Como os próprios autores resumem, a mera vinculação de um
39
usuário a um aplicativo de saúde mental já pode revelar que essa pessoa possui
40
uma condição psicológica — seja ansiedade, depressão, ou, no caso de um
41
aplicativo como o Nexo, Transtorno Afetivo Bipolar —, tornando usuários desses
42
aplicativos particularmente vulneráveis a esse tipo de exposição
43
\cite{Iwaya:22}.
44

45
No caso do Nexo, essa cadeia de inferência é especialmente
46
sensível: a presença do aplicativo na lista de apps instalados de um usuário,
47
associada ao seu identificador publicitário, permitiria a uma plataforma como a
48
Meta inferir uma possível condição de saúde mental do usuário para fins de
49
segmentação de anúncios, sem que este tenha conhecimento ou consentimento
50
explícito disso.
51

52
Segundo, e retomando a proposta de oferecer ao usuário a possibilidade
53
de \textit{self-service}, aquele que decidisse manter uma instância
54
própria do aplicativo não precisaria de uma conta em uma plataforma de
55
terceiro, nem se cadastrar nelas.
56

57
\begin{figure}[H]
58
\centering
59
\caption{Tela de login}
60
\label{fig:screenshot-login}
61
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-login.jpeg}
62
\source{O autor, 2026}
63
\end{figure}
64

65
Por fim, destaca-se aqui que, conforme mencionado anteriormente na
66
modelagem de casos de uso (figura \ref{fig:use-cases}), ao realizar o
67
login pela primeira vez é enviado um email com um código de
68
verificação, seguindo a lógica dos \textit{magic links}. Isso adiciona
69
uma camada extra de segurança, garantindo que apenas o usuário que
70
solicitou o login possa acessar a conta.
71

72
\section{Página de Consulta de Registros}
73

74
A tela inicial é a tela nomeada apenas como ``Novo''. A proposta aqui
75
é ser a tela de cadastro rápido de um humor, e também é a tela que
76
visualmente mais destoa das demais. O usuário é apresentado com três
77
seções distintas:
78

79
\begin{itemize}
80
    \item Cadastro rápido de um humor
81
    \item Entre ontem e hoje
82
    \item Registros recentes
83
\end{itemize}
84

85
Respectivamente: uma seção em que o usuário é convidado a ``escolher
86
um humor'' e iniciar o processo de registro de uma nova entrada; a
87
seção em que são apresentados os indicadores de nível de energia
88
acumulado entre o dia anterior e o dia atual, além da média de sono do
89
dia comparada com a do dia anterior; e, por fim, a listagem dos dez
90
últimos registros de humor cadastrados pelo usuário.
91

92
\begin{figure}[H]
93
\centering
94
\caption{Tela de Consulta de Registros}
95
\label{fig:screenshot-consulta-registros}
96
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-initial-page.jpeg}
97
\source{O autor, 2026}
98
\end{figure}
99

100
Aqui já é introduzido ao usuário um padrão de organização e hierarquia:
101
todos os elementos centrais são organizados em \textit{cards}, exibidos
102
em no máximo duas colunas. Também é introduzido, caso o usuário já
103
possua registros de humor cadastrados, o padrão pelo qual esses
104
registros são resumidos em todas as seções do aplicativo: geralmente
105
um ícone, um título e alguma informação adicional em destaque.
106

107
\section{Criação de Registros de Humor}
108

109
Nesta seção, o usuário pode criar novos registros de humor, escolhendo
110
entre uma lista de opções pré-definidas. O humor selecionado na tela
111
anterior é mostrado aqui, e o usuário é convidado a julgar, em uma
112
escala de 1 a 10, como se sente em relação aos níveis de energia,
113
estresse e ansiedade, respectivamente.
114

115
\begin{figure}[H]
116
\centering
117
\caption{Criação de Registros de Humor}
118
\label{fig:screenshot-consulta-humor}
119
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-create-mood.jpeg}
120
\source{O autor, 2026}
121
\end{figure}
122

123
Naturalmente, é uma questão difícil de responder — e, como o próprio
124
aplicativo procura deixar claro, é importante que seja um momento
125
reflexivo, não necessariamente preciso.
126

127
O usuário pode adicionar uma anotação sobre aquele registro em
128
específico, padrão que se repete em outras telas do aplicativo.
129

130
Por fim, o usuário pode escolher o que compõe aquele registro, ou
131
seja, selecionar emoções e estados/sentimentos que sente naquele
132
momento. É apresentada uma listagem mista desses elementos, na qual o
133
usuário seleciona os que mais se aplicam a ele e atribui um nível de
134
intensidade para cada um. Aqui a escala é menor e mais simples, visando
135
facilitar a escolha e o julgamento do usuário, entre ``Leve'',
136
``Moderado'' e ``Intenso'', conforme a figura
137
\ref{fig:screenshot-add-components}.
138

139
\begin{figure}[H]
140
\centering
141
\caption{Adicionando sentimentos/emoções}
142
\label{fig:screenshot-add-components}
143
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-add-components.jpeg}
144
\source{O autor, 2026}
145
\end{figure}
146

147
Ao concluir esse processo e salvar, é apresentada ao usuário uma tela
148
de confirmação, na qual ele pode, opcionalmente, vincular o registro a
149
um gatilho específico — que pode ter ocorrido antes de ele salvar o
150
registro — ou criar um novo gatilho. O projeto novamente se ancora no
151
EMA, enriquecendo o registro de humor com mais contexto sobre o que
152
aconteceu.
153

154
\begin{figure}[H]
155
\centering
156
\caption{Vinculando um humor com um gatilho}
157
\label{fig:screenshot-link-mood-trigger}
158
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-with-trigger.jpeg}
159
\source{O autor, 2026}
160
\end{figure}
161

162
Em seguida, o usuário pode indicar o impacto que aquele gatilho
163
exerceu sobre o registro de humor em questão. Novamente, trata-se de
164
uma estimativa subjetiva, sem pretensão de precisão.
165

166
\begin{figure}[H]
167
\centering
168
\caption{Avaliando o impacto de um gatilho no humor}
169
\label{fig:screenshot-assess-trigger-mood-impact}
170
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-assess-impact.jpeg}
171
\source{O autor, 2026}
172
\end{figure}
173

174
Por fim, vale mencionar que, após esse processo, é enfileirado
175
internamente um \textit{background job} que recalcula, sob demanda, o
176
indicador de energia daquele dia, apresentado na figura
177
\ref{fig:screenshot-consulta-registros}. Diferentemente deste, os
178
indicadores semanais — como a correlação entre sono e energia,
179
descrita na seção \ref{sec:insights} — não são recalculados a cada
180
registro individual, sendo processados apenas pelo job semanal
181
agendado (seção \ref{sec:insights}).
182

183
\section{Indicadores}\label{sec:insights}
184

185
Nessa tela é apresentado um conjunto de indicadores construídos a partir
186
dos registros de humor, sono e gatilho do usuário. Diferente das demais
187
telas do aplicativo, que operam sobre dados em tempo real, os indicadores
188
são artefatos pré-computados: um \textit{worker} assíncrono (\textit{BullMQ})
189
percorre semanalmente todos os usuários ativos e enfileira, para cada
190
um, um conjunto de \textit{jobs} — um por tipo de indicador — que
191
processam a janela dos últimos sete dias e persistem o resultado em uma
192
tabela dedicada. Vale notar que nem todos os indicadores seguem esse
193
fluxo agendado: os indicadores diários (energia e sono) são recalculados
194
sob demanda, no momento em que o usuário registra um novo humor ou
195
sessão de sono, enquanto os indicadores semanais dependem
196
exclusivamente do \textit{job} de \textit{fan-out} de segunda-feira.
197

198
O aplicativo móvel apenas consulta esse resultado já
199
calculado, o que evita repetir cálculos custosos a cada abertura da tela
200
e desacopla a lógica analítica do restante da API.
201

202
\begin{figure}[H]
203
\centering
204
\caption{Tela de indicadores}
205
\label{fig:screenshot-insights}
206
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-insights.jpeg}
207
\source{O autor, 2026}
208
\end{figure}
209

210
% TODO: referenciar EMA / momentary assessment como justificativa da janela de 7 dias
211

212
São três os indicadores semanais exibidos: tendência de humor, correlação
213
entre sono e energia, e padrão de gatilhos.
214

215
\begin{itemize}
216
    \item \textbf{Tendência de humor}: compara a média de humor da
217
    primeira metade da semana com a da segunda metade, expressando a
218
    diferença como uma variação percentual. O resultado é classificado
219
    como melhora, piora ou estabilidade a partir de uma margem de $\pm10\%$.
220

221
    \item \textbf{Correlação entre sono e energia}: relaciona a duração
222
    do sono de uma noite com o nível de energia relatado na manhã
223
    seguinte, através do coeficiente de correlação de Pearson. Exige um
224
    mínimo de observações pareadas para ser calculado — caso contrário,
225
    o indicador simplesmente não é exibido.
226

227
    \item \textbf{Padrão de gatilhos}: identifica a categoria de gatilho
228
    mais frequente na semana e expressa sua predominância como percentual
229
    do total de registros.
230
\end{itemize}
231

232
É intencional, na figura \ref{fig:screenshot-insights}, que o bloco de
233
``Energia'' apareça vazio: o cálculo da correlação depende da existência
234
simultânea de registros de sono \emph{e} de humor em quantidade mínima,
235
e no período retratado o usuário ainda não havia acumulado dados
236
suficientes de ambos os tipos. Optou-se por não exibir uma correlação
237
calculada com poucos pontos, preferindo comunicar a ausência de dado a
238
apresentar um número pouco confiável.
239

240
O bloco maior no topo da tela, o ``Resumo Semanal'', condensa os
241
indicadores mais centrais — média de sono do período e um rótulo de
242
humor (``Estável'', no exemplo). Esse rótulo, no entanto, é o elemento
243
mais delicado de toda a funcionalidade. Embora exista uma fórmula capaz
244
de produzir uma classificação de estabilidade a partir da variância dos
245
registros de humor, atribuir esse tipo de afirmação a um usuário —
246
especialmente em um aplicativo que é utilizado por pessoas com
247
Transtorno Afetivo Bipolar, para quem uma leitura equivocada de
248
``estabilidade'' pode mascarar justamente o início de um episódio —
249
exige um embasamento mais cuidadoso do que uma regra estatística
250
simples. Por esse motivo, o rótulo apresentado nesta versão do
251
aplicativo é estático (não deriva de fato do cálculo de estabilidade) e
252
a funcionalidade pode ser inteiramente desabilitada pelo usuário nas
253
configurações. A decisão de manter ou não uma afirmação automatizada
254
desse tipo, e sob quais critérios, permanece um ponto em aberto que
255
mereceria revisão de literatura específica antes de ser tratado como
256
funcionalidade definitiva.
257

258
% TODO: literatura sobre riscos de auto-monitoramento automatizado de humor / mood-tracking apps e TAB
259

260
\section{Histórico}
261

262

263
Nessa tela é apresentado o histórico consolidado de registros de humor,
264
sono, gatilho e ações de cuidado (como sessões de terapia), organizados
265
cronologicamente e agrupados por dia, conforme a figura
266
\ref{fig:screenshot-history}. O usuário pode ainda filtrar a listagem por
267
categoria (``Humor'', ``Sono'', ``Gatilho'' e ``Ações de Cuidado''),
268
reduzindo o volume de informação exibida.
269

270
\begin{figure}[H]
271
\centering
272
\caption{Tela de Histórico}
273
\label{fig:screenshot-history}
274
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-history.jpeg}
275
\source{O autor, 2026}
276
\end{figure}
277

278
Como os quatro tipos de dado residem em recursos distintos da API, a
279
tela consulta os respectivos \textit{endpoints} em paralelo e, em
280
seguida, processa o resultado no próprio aplicativo. Para isso, é
281
utilizado um pequeno serviço que atua como \textit{mapper}, transformando
282
os dados de cada \textit{endpoint} em um formato comum, apresentado no
283
código \ref{lst:history-card}.
284

285
\newpage
286

287
\begin{lstlisting}[caption={Formato comum da tela de histórico}, label={lst:history-card}]
288
export type HistoryCard = {
289
  id: string; // "<category>-<id>" to avoid collisions
290
  category: HistoryCategory;
291
  subtype?: CareActionSubtype; // only set when category === "care_action"
292
  timestamp: string; // ISO string — used for sorting and display
293
  title: string;
294
  summary: string;
295
  badge?: HistoryBadge;
296
  raw: MoodEntry | SleepRecord | Trigger | CareAction;
297
};
298
\end{lstlisting}
299

300
Após a normalização, os quatro conjuntos de dados são combinados em uma
301
única lista ordenada pelo campo \texttt{timestamp} e reagrupados por dia
302
para exibição, conforme visto na figura \ref{fig:screenshot-history}, nos
303
cabeçalhos ``terça-feira, 14 de julho'' e ``segunda-feira, 13 de julho''.
304
Essa unificação é proposital: ao invés de apresentar quatro telas
305
separadas por tipo de dado, o histórico busca reconstruir uma narrativa
306
única do dia do usuário, aproximando-se do princípio de \textit{Ecological
307
Momentary Assessment} já mencionado anteriormente — o contexto de um
308
registro de humor (por exemplo, o gatilho ``Interno'' registrado três
309
minutos antes, na mesma figura) fica visualmente próximo do evento que
310
possivelmente o motivou.
311

312
A propriedade \texttt{raw} armazena o dado original, permitindo que a
313
listagem redirecione o usuário para a tela de detalhe correta ao tocar em
314
um card, independentemente da categoria. Já a propriedade \texttt{badge}
315
reaproveita o mesmo mecanismo já descrito na seção de indicadores: para
316
um registro de sono, sinaliza se a duração foi insuficiente; para um
317
registro de humor, destaca a dimensão mais relevante daquele registro
318
(como ``Ansiedade alta'' na figura \ref{fig:screenshot-history}); para um
319
gatilho, indica sua categoria, e assim por diante.
320

321
\FloatBarrier