Merge remote-tracking branch 'Nightscout/dev' into wear/new_custom_watchface

This commit is contained in:
Philoul 2023-08-15 23:50:35 +02:00
commit 5cac5526c4
195 changed files with 1443 additions and 475 deletions

View file

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g>
<ellipse fill="#0FBBE0" cx="24" cy="24" rx="22.031" ry="21.688"/>
<g>
<path fill="#FFFFFF" d="M36.136,17.006c0.073,0.633,0.147,1.265,0.11,1.898c-0.055,1.066-0.165,2.133-0.349,3.199
c-0.257,1.428-0.643,2.801-1.138,4.175c-0.569,1.536-1.285,3-2.075,4.428c-0.698,1.283-1.469,2.494-2.313,3.687
c-0.643,0.922-1.34,1.825-2.056,2.711c-0.789,0.94-2.442,2.856-3.598,3.958c-0.441,0.416-1.01,0.416-1.432,0
c-1.157-1.121-2.221-2.331-3.25-3.56c-1.157-1.374-2.221-2.783-3.195-4.265c-0.973-1.464-1.836-2.982-2.589-4.572
c-0.863-1.825-1.524-3.723-1.983-5.675c-0.147-0.687-0.239-1.392-0.349-2.096c-0.11-0.705-0.129-1.41-0.147-2.151
c-0.037-0.614,0.018-1.247,0.11-1.843c0.092-0.759,0.275-1.482,0.514-2.205c0.459-1.301,1.12-2.494,2.001-3.578
c1.248-1.554,2.772-2.765,4.627-3.578c1.083-0.47,2.185-0.813,3.378-0.94c0.551-0.054,1.12-0.127,1.689-0.127
c1.763,0.036,3.433,0.398,5.03,1.121c1.138,0.524,2.166,1.211,3.121,2.06c1.267,1.121,2.221,2.458,2.938,3.976
C35.677,14.711,35.989,15.831,36.136,17.006z M33.712,21.181c0.257-1.102,0.496-2.187,0.22-3.325
c-0.294-1.319-1.028-2.331-2.277-2.91c-1.469-0.687-2.974-0.669-4.425,0.145c-1.377,0.777-2.075,2.024-2.13,3.56
c-0.055,1.753,0,3.506,0,5.241c0,0.506-0.092,0.596-0.624,0.596c-0.33,0-0.643-0.018-0.973,0.018
c-0.422,0.036-0.606-0.163-0.606-0.596c0-0.904,0-1.789,0-2.693c0-0.759,0-1.536,0-2.313c0.018-0.38-0.037-0.759-0.129-1.139
c-0.257-1.139-0.881-2.042-1.891-2.639c-1.046-0.633-2.185-0.777-3.396-0.578c-2.111,0.361-3.488,2.205-3.543,4.211
c-0.018,0.578,0.092,1.139,0.184,1.717c0.202,1.048,0.569,2.042,1.102,2.946c0.734,1.229,1.652,2.295,2.827,3.127
c1.542,1.102,3.231,1.753,5.104,1.88c1.212,0.09,2.405-0.018,3.58-0.343c2.056-0.578,3.745-1.663,5.086-3.289
C32.702,23.729,33.363,22.518,33.712,21.181z M31.197,12.632c0.349,0.072,0.661,0.199,1.01,0.235
c-1.909-2.602-4.516-4.084-7.766-4.211c-3.617-0.127-6.518,1.337-8.702,4.229c0.092,0,0.11,0.018,0.147,0
c0.129-0.036,0.239-0.072,0.367-0.108c1.046-0.343,2.13-0.398,3.213-0.253c1.377,0.181,2.589,0.741,3.617,1.681
c0.275,0.253,0.514,0.542,0.716,0.831c0.11,0.163,0.22,0.307,0.404,0.018c0.312-0.488,0.716-0.904,1.193-1.247
C27.158,12.524,29.104,12.198,31.197,12.632z M31.601,28.03c-0.569,0.398-1.157,0.759-1.762,1.102
c-1.707,0.922-3.543,1.374-5.471,1.464c-0.165,0.018-0.239,0.054-0.312,0.199c-0.147,0.289-0.312,0.56-0.477,0.831
c-0.734,1.265-1.542,2.476-2.387,3.651c-0.11,0.127-0.092,0.181,0,0.289c0.257,0.325,0.532,0.651,0.808,0.976
c0.624,0.759,1.304,1.482,2.001,2.223C27.084,35.549,29.728,32.061,31.601,28.03z M21.705,30.633
c0.092-0.163,0.129-0.235-0.147-0.289c-0.955-0.181-1.873-0.488-2.772-0.904c-0.826-0.398-1.616-0.886-2.387-1.41
c0.9,1.988,2.038,3.831,3.305,5.621c0.165-0.217,0.312-0.416,0.441-0.614C20.695,32.259,21.191,31.428,21.705,30.633z"/>
<path fill="#FFFFFF" d="M29.6,15c2.111,0.018,3.837,1.681,3.819,3.813c-0.018,2.115-1.671,3.741-3.855,3.759
c-2.111,0-3.855-1.717-3.837-3.85C25.763,16.662,27.488,14.982,29.6,15z M31.252,18.813c0.037-0.922-0.808-1.771-1.689-1.663
c-0.826-0.108-1.652,0.759-1.671,1.572c-0.018,0.904,0.789,1.699,1.671,1.717C30.499,20.44,31.234,19.608,31.252,18.813z"/>
<path fill="#FFFFFF" d="M18.602,15c1.909,0.054,3.672,1.681,3.672,3.759c-0.018,2.205-1.763,3.813-3.874,3.795
c-2.13,0-3.819-1.663-3.819-3.813C14.582,16.735,16.252,14.927,18.602,15z M18.419,20.44c0.863,0,1.762-0.777,1.671-1.681
c0.092-0.886-0.826-1.59-1.524-1.627c-1.138-0.054-1.799,0.868-1.818,1.608C16.73,19.681,17.538,20.422,18.419,20.44z"/>
</g>
<g>
<path fill="#010101" d="M38.394,16.066c0.055,0.343,0.184,1.374,0.184,2.512c0,1.283-0.165,2.892-0.257,3.416
c-0.202,1.464-0.588,2.91-1.046,4.319c-0.624,1.825-1.395,3.597-2.332,5.295c-0.588,1.048-1.193,2.06-1.854,3.054
c-0.698,1.066-1.45,2.115-2.258,3.109c-0.771,0.958-1.542,1.916-2.35,2.819c-0.275,0.289-0.551,0.578-0.826,0.868
c-0.514,0.578-0.973,1.048-1.579,1.536c-1.304,1.211-3.213,1.121-4.351-0.145c-0.863-0.831-1.671-1.699-2.46-2.584
c-0.973-1.121-1.909-2.259-2.791-3.434c-1.322-1.753-2.515-3.578-3.562-5.494c-0.753-1.355-1.377-2.783-1.909-4.265
c-0.698-1.97-1.267-3.994-1.469-6.109c-0.018-0.253-0.11-1.283-0.11-2.386c0-1.157,0.129-2.096,0.184-2.44
c0.202-1.374,0.661-2.657,1.267-3.886c0.477-1.012,1.102-1.934,1.818-2.819c0.716-0.831,1.487-1.59,2.35-2.259
c0.955-0.723,1.983-1.337,3.103-1.807c1.212-0.524,2.479-0.886,3.8-1.066c0.239-0.018,1.102-0.108,2.148-0.108
c1.322,0,2.644,0.199,3.231,0.343c1.34,0.307,2.625,0.795,3.837,1.464c1.707,0.94,3.158,2.187,4.37,3.687
c0.863,1.084,1.561,2.277,2.075,3.578C37.953,14.168,38.229,15.108,38.394,16.066z M36.246,18.903
c0.037-0.633-0.037-1.265-0.11-1.898c-0.147-1.175-0.459-2.295-0.955-3.38c-0.716-1.518-1.671-2.856-2.938-3.976
c-0.955-0.849-1.983-1.536-3.121-2.06c-1.597-0.723-3.268-1.084-5.03-1.121c-0.569,0-1.138,0.072-1.689,0.127
c-1.193,0.127-2.295,0.47-3.378,0.94c-1.854,0.813-3.378,2.024-4.627,3.578c-0.881,1.084-1.542,2.277-2.001,3.578
c-0.239,0.723-0.422,1.446-0.514,2.205c-0.092,0.596-0.147,1.229-0.11,1.843c0.018,0.741,0.037,1.446,0.147,2.151
c0.11,0.705,0.202,1.41,0.349,2.096c0.459,1.952,1.12,3.85,1.983,5.675c0.753,1.59,1.616,3.109,2.589,4.572
c0.973,1.482,2.038,2.892,3.195,4.265c1.028,1.229,2.093,2.44,3.25,3.56c0.422,0.416,0.991,0.416,1.432,0
c1.157-1.102,2.809-3.018,3.598-3.958c0.716-0.886,1.414-1.789,2.056-2.711c0.845-1.193,1.616-2.404,2.313-3.687
c0.789-1.428,1.505-2.892,2.075-4.428c0.496-1.374,0.881-2.747,1.138-4.175C36.08,21.036,36.191,19.97,36.246,18.903z"/>
<path fill="#010101" d="M33.932,17.855c0.275,1.139,0.037,2.223-0.22,3.325c-0.349,1.337-1.01,2.548-1.891,3.615
c-1.34,1.627-3.029,2.711-5.086,3.289c-1.175,0.325-2.368,0.434-3.58,0.343c-1.873-0.127-3.562-0.777-5.104-1.88
c-1.175-0.831-2.093-1.898-2.827-3.127c-0.532-0.904-0.9-1.898-1.102-2.946c-0.092-0.578-0.202-1.139-0.184-1.717
c0.055-2.006,1.432-3.85,3.543-4.211c1.212-0.199,2.35-0.054,3.396,0.578c1.01,0.596,1.634,1.5,1.891,2.639
c0.092,0.38,0.147,0.759,0.129,1.139c0,0.777,0,1.554,0,2.313c0,0.904,0,1.789,0,2.693c0,0.434,0.184,0.633,0.606,0.596
c0.33-0.036,0.643-0.018,0.973-0.018c0.532,0,0.624-0.09,0.624-0.596c0-1.735-0.055-3.488,0-5.241
c0.055-1.536,0.753-2.783,2.13-3.56c1.45-0.813,2.956-0.831,4.425-0.145C32.904,15.524,33.639,16.536,33.932,17.855z
M33.418,18.813C33.437,16.68,31.711,15.018,29.6,15s-3.837,1.663-3.874,3.723c-0.018,2.133,1.726,3.85,3.837,3.85
C31.748,22.554,33.4,20.928,33.418,18.813z M22.274,18.759c0-2.078-1.763-3.705-3.672-3.759c-2.35-0.072-4.021,1.735-4.021,3.741
c0,2.151,1.689,3.813,3.819,3.813C20.512,22.572,22.256,20.964,22.274,18.759z"/>
<path fill="#010101" d="M32.207,12.867c-0.349-0.036-0.661-0.163-1.01-0.235c-2.093-0.434-4.039-0.108-5.802,1.175
c-0.477,0.343-0.881,0.759-1.193,1.247c-0.184,0.289-0.294,0.145-0.404-0.018c-0.202-0.289-0.441-0.578-0.716-0.831
c-1.028-0.94-2.24-1.5-3.617-1.681c-1.083-0.145-2.166-0.09-3.213,0.253c-0.129,0.036-0.239,0.072-0.367,0.108
c-0.037,0.018-0.055,0-0.147,0c2.185-2.892,5.086-4.356,8.702-4.229C27.69,8.783,30.297,10.265,32.207,12.867z"/>
<path fill="#010101" d="M29.563,17.15c0.881-0.108,1.726,0.741,1.689,1.663c-0.018,0.795-0.753,1.627-1.689,1.627
c-0.881-0.018-1.689-0.813-1.671-1.717C27.911,17.909,28.737,17.042,29.563,17.15z"/>
<path fill="#010101" d="M29.838,29.133c0.606-0.343,1.193-0.705,1.762-1.102c-1.873,4.03-4.516,7.518-7.601,10.735
c-0.698-0.741-1.377-1.464-2.001-2.223c-0.275-0.325-0.551-0.651-0.808-0.976c-0.092-0.108-0.11-0.163,0-0.289
c0.845-1.175,1.652-2.386,2.387-3.651c0.165-0.271,0.33-0.542,0.477-0.831c0.073-0.145,0.147-0.181,0.312-0.199
C26.295,30.506,28.131,30.054,29.838,29.133z"/>
<path fill="#010101" d="M21.558,30.344c0.275,0.054,0.239,0.127,0.147,0.289c-0.514,0.795-1.01,1.627-1.561,2.404
c-0.129,0.199-0.275,0.398-0.441,0.614c-1.267-1.789-2.405-3.633-3.305-5.621c0.771,0.524,1.561,1.012,2.387,1.41
C19.686,29.856,20.604,30.163,21.558,30.344z"/>
<path fill="#010101" d="M20.089,18.759c0.092,0.904-0.808,1.681-1.671,1.681c-0.881-0.018-1.689-0.759-1.671-1.699
c0.018-0.741,0.679-1.663,1.818-1.608C19.263,17.168,20.181,17.873,20.089,18.759z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g>
<ellipse fill="#E8C50C" cx="24" cy="24" rx="22.031" ry="21.688"/>
<g>
<path fill="#FFFFFF" d="M36.136,17.006c0.073,0.633,0.147,1.265,0.11,1.898c-0.055,1.066-0.165,2.133-0.349,3.199
c-0.257,1.428-0.643,2.801-1.138,4.175c-0.569,1.536-1.285,3-2.075,4.428c-0.698,1.283-1.469,2.494-2.313,3.687
c-0.643,0.922-1.34,1.825-2.056,2.711c-0.789,0.94-2.442,2.856-3.598,3.958c-0.441,0.416-1.01,0.416-1.432,0
c-1.157-1.121-2.221-2.331-3.25-3.56c-1.157-1.374-2.221-2.783-3.195-4.265c-0.973-1.464-1.836-2.982-2.589-4.572
c-0.863-1.825-1.524-3.723-1.983-5.675c-0.147-0.687-0.239-1.392-0.349-2.096c-0.11-0.705-0.129-1.41-0.147-2.151
c-0.037-0.614,0.018-1.247,0.11-1.843c0.092-0.759,0.275-1.482,0.514-2.205c0.459-1.301,1.12-2.494,2.001-3.578
c1.248-1.554,2.772-2.765,4.627-3.578c1.083-0.47,2.185-0.813,3.378-0.94c0.551-0.054,1.12-0.127,1.689-0.127
c1.763,0.036,3.433,0.398,5.03,1.121c1.138,0.524,2.166,1.211,3.121,2.06c1.267,1.121,2.221,2.458,2.938,3.976
C35.677,14.711,35.989,15.831,36.136,17.006z M33.712,21.181c0.257-1.102,0.496-2.187,0.22-3.325
c-0.294-1.319-1.028-2.331-2.277-2.91c-1.469-0.687-2.974-0.669-4.425,0.145c-1.377,0.777-2.075,2.024-2.13,3.56
c-0.055,1.753,0,3.506,0,5.241c0,0.506-0.092,0.596-0.624,0.596c-0.33,0-0.643-0.018-0.973,0.018
c-0.422,0.036-0.606-0.163-0.606-0.596c0-0.904,0-1.789,0-2.693c0-0.759,0-1.536,0-2.313c0.018-0.38-0.037-0.759-0.129-1.139
c-0.257-1.139-0.881-2.042-1.891-2.639c-1.046-0.633-2.185-0.777-3.396-0.578c-2.111,0.361-3.488,2.205-3.543,4.211
c-0.018,0.578,0.092,1.139,0.184,1.717c0.202,1.048,0.569,2.042,1.102,2.946c0.734,1.229,1.652,2.295,2.827,3.127
c1.542,1.102,3.231,1.753,5.104,1.88c1.212,0.09,2.405-0.018,3.58-0.343c2.056-0.578,3.745-1.663,5.086-3.289
C32.702,23.729,33.363,22.518,33.712,21.181z M31.197,12.632c0.349,0.072,0.661,0.199,1.01,0.235
c-1.909-2.602-4.516-4.084-7.766-4.211c-3.617-0.127-6.518,1.337-8.702,4.229c0.092,0,0.11,0.018,0.147,0
c0.129-0.036,0.239-0.072,0.367-0.108c1.046-0.343,2.13-0.398,3.213-0.253c1.377,0.181,2.589,0.741,3.617,1.681
c0.275,0.253,0.514,0.542,0.716,0.831c0.11,0.163,0.22,0.307,0.404,0.018c0.312-0.488,0.716-0.904,1.193-1.247
C27.158,12.524,29.104,12.198,31.197,12.632z M31.601,28.03c-0.569,0.398-1.157,0.759-1.762,1.102
c-1.707,0.922-3.543,1.374-5.471,1.464c-0.165,0.018-0.239,0.054-0.312,0.199c-0.147,0.289-0.312,0.56-0.477,0.831
c-0.734,1.265-1.542,2.476-2.387,3.651c-0.11,0.127-0.092,0.181,0,0.289c0.257,0.325,0.532,0.651,0.808,0.976
c0.624,0.759,1.304,1.482,2.001,2.223C27.084,35.549,29.728,32.061,31.601,28.03z M21.705,30.633
c0.092-0.163,0.129-0.235-0.147-0.289c-0.955-0.181-1.873-0.488-2.772-0.904c-0.826-0.398-1.616-0.886-2.387-1.41
c0.9,1.988,2.038,3.831,3.305,5.621c0.165-0.217,0.312-0.416,0.441-0.614C20.695,32.259,21.191,31.428,21.705,30.633z"/>
<path fill="#FFFFFF" d="M29.6,15c2.111,0.018,3.837,1.681,3.819,3.813c-0.018,2.115-1.671,3.741-3.855,3.759
c-2.111,0-3.855-1.717-3.837-3.85C25.763,16.662,27.488,14.982,29.6,15z M31.252,18.813c0.037-0.922-0.808-1.771-1.689-1.663
c-0.826-0.108-1.652,0.759-1.671,1.572c-0.018,0.904,0.789,1.699,1.671,1.717C30.499,20.44,31.234,19.608,31.252,18.813z"/>
<path fill="#FFFFFF" d="M18.602,15c1.909,0.054,3.672,1.681,3.672,3.759c-0.018,2.205-1.763,3.813-3.874,3.795
c-2.13,0-3.819-1.663-3.819-3.813C14.582,16.735,16.252,14.927,18.602,15z M18.419,20.44c0.863,0,1.762-0.777,1.671-1.681
c0.092-0.886-0.826-1.59-1.524-1.627c-1.138-0.054-1.799,0.868-1.818,1.608C16.73,19.681,17.538,20.422,18.419,20.44z"/>
</g>
<g>
<path fill="#010101" d="M38.394,16.066c0.055,0.343,0.184,1.374,0.184,2.512c0,1.283-0.165,2.892-0.257,3.416
c-0.202,1.464-0.588,2.91-1.046,4.319c-0.624,1.825-1.395,3.597-2.332,5.295c-0.588,1.048-1.193,2.06-1.854,3.054
c-0.698,1.066-1.45,2.115-2.258,3.109c-0.771,0.958-1.542,1.916-2.35,2.819c-0.275,0.289-0.551,0.578-0.826,0.868
c-0.514,0.578-0.973,1.048-1.579,1.536c-1.304,1.211-3.213,1.121-4.351-0.145c-0.863-0.831-1.671-1.699-2.46-2.584
c-0.973-1.121-1.909-2.259-2.791-3.434c-1.322-1.753-2.515-3.578-3.562-5.494c-0.753-1.355-1.377-2.783-1.909-4.265
c-0.698-1.97-1.267-3.994-1.469-6.109c-0.018-0.253-0.11-1.283-0.11-2.386c0-1.157,0.129-2.096,0.184-2.44
c0.202-1.374,0.661-2.657,1.267-3.886c0.477-1.012,1.102-1.934,1.818-2.819c0.716-0.831,1.487-1.59,2.35-2.259
c0.955-0.723,1.983-1.337,3.103-1.807c1.212-0.524,2.479-0.886,3.8-1.066c0.239-0.018,1.102-0.108,2.148-0.108
c1.322,0,2.644,0.199,3.231,0.343c1.34,0.307,2.625,0.795,3.837,1.464c1.707,0.94,3.158,2.187,4.37,3.687
c0.863,1.084,1.561,2.277,2.075,3.578C37.953,14.168,38.229,15.108,38.394,16.066z M36.246,18.903
c0.037-0.633-0.037-1.265-0.11-1.898c-0.147-1.175-0.459-2.295-0.955-3.38c-0.716-1.518-1.671-2.856-2.938-3.976
c-0.955-0.849-1.983-1.536-3.121-2.06c-1.597-0.723-3.268-1.084-5.03-1.121c-0.569,0-1.138,0.072-1.689,0.127
c-1.193,0.127-2.295,0.47-3.378,0.94c-1.854,0.813-3.378,2.024-4.627,3.578c-0.881,1.084-1.542,2.277-2.001,3.578
c-0.239,0.723-0.422,1.446-0.514,2.205c-0.092,0.596-0.147,1.229-0.11,1.843c0.018,0.741,0.037,1.446,0.147,2.151
c0.11,0.705,0.202,1.41,0.349,2.096c0.459,1.952,1.12,3.85,1.983,5.675c0.753,1.59,1.616,3.109,2.589,4.572
c0.973,1.482,2.038,2.892,3.195,4.265c1.028,1.229,2.093,2.44,3.25,3.56c0.422,0.416,0.991,0.416,1.432,0
c1.157-1.102,2.809-3.018,3.598-3.958c0.716-0.886,1.414-1.789,2.056-2.711c0.845-1.193,1.616-2.404,2.313-3.687
c0.789-1.428,1.505-2.892,2.075-4.428c0.496-1.374,0.881-2.747,1.138-4.175C36.08,21.036,36.191,19.97,36.246,18.903z"/>
<path fill="#010101" d="M33.932,17.855c0.275,1.139,0.037,2.223-0.22,3.325c-0.349,1.337-1.01,2.548-1.891,3.615
c-1.34,1.627-3.029,2.711-5.086,3.289c-1.175,0.325-2.368,0.434-3.58,0.343c-1.873-0.127-3.562-0.777-5.104-1.88
c-1.175-0.831-2.093-1.898-2.827-3.127c-0.532-0.904-0.9-1.898-1.102-2.946c-0.092-0.578-0.202-1.139-0.184-1.717
c0.055-2.006,1.432-3.85,3.543-4.211c1.212-0.199,2.35-0.054,3.396,0.578c1.01,0.596,1.634,1.5,1.891,2.639
c0.092,0.38,0.147,0.759,0.129,1.139c0,0.777,0,1.554,0,2.313c0,0.904,0,1.789,0,2.693c0,0.434,0.184,0.633,0.606,0.596
c0.33-0.036,0.643-0.018,0.973-0.018c0.532,0,0.624-0.09,0.624-0.596c0-1.735-0.055-3.488,0-5.241
c0.055-1.536,0.753-2.783,2.13-3.56c1.45-0.813,2.956-0.831,4.425-0.145C32.904,15.524,33.639,16.536,33.932,17.855z
M33.418,18.813C33.437,16.68,31.711,15.018,29.6,15s-3.837,1.663-3.874,3.723c-0.018,2.133,1.726,3.85,3.837,3.85
C31.748,22.554,33.4,20.928,33.418,18.813z M22.274,18.759c0-2.078-1.763-3.705-3.672-3.759c-2.35-0.072-4.021,1.735-4.021,3.741
c0,2.151,1.689,3.813,3.819,3.813C20.512,22.572,22.256,20.964,22.274,18.759z"/>
<path fill="#010101" d="M32.207,12.867c-0.349-0.036-0.661-0.163-1.01-0.235c-2.093-0.434-4.039-0.108-5.802,1.175
c-0.477,0.343-0.881,0.759-1.193,1.247c-0.184,0.289-0.294,0.145-0.404-0.018c-0.202-0.289-0.441-0.578-0.716-0.831
c-1.028-0.94-2.24-1.5-3.617-1.681c-1.083-0.145-2.166-0.09-3.213,0.253c-0.129,0.036-0.239,0.072-0.367,0.108
c-0.037,0.018-0.055,0-0.147,0c2.185-2.892,5.086-4.356,8.702-4.229C27.69,8.783,30.297,10.265,32.207,12.867z"/>
<path fill="#010101" d="M29.563,17.15c0.881-0.108,1.726,0.741,1.689,1.663c-0.018,0.795-0.753,1.627-1.689,1.627
c-0.881-0.018-1.689-0.813-1.671-1.717C27.911,17.909,28.737,17.042,29.563,17.15z"/>
<path fill="#010101" d="M29.838,29.133c0.606-0.343,1.193-0.705,1.762-1.102c-1.873,4.03-4.516,7.518-7.601,10.735
c-0.698-0.741-1.377-1.464-2.001-2.223c-0.275-0.325-0.551-0.651-0.808-0.976c-0.092-0.108-0.11-0.163,0-0.289
c0.845-1.175,1.652-2.386,2.387-3.651c0.165-0.271,0.33-0.542,0.477-0.831c0.073-0.145,0.147-0.181,0.312-0.199
C26.295,30.506,28.131,30.054,29.838,29.133z"/>
<path fill="#010101" d="M21.558,30.344c0.275,0.054,0.239,0.127,0.147,0.289c-0.514,0.795-1.01,1.627-1.561,2.404
c-0.129,0.199-0.275,0.398-0.441,0.614c-1.267-1.789-2.405-3.633-3.305-5.621c0.771,0.524,1.561,1.012,2.387,1.41
C19.686,29.856,20.604,30.163,21.558,30.344z"/>
<path fill="#010101" d="M20.089,18.759c0.092,0.904-0.808,1.681-1.671,1.681c-0.881-0.018-1.689-0.759-1.671-1.699
c0.018-0.741,0.679-1.663,1.818-1.608C19.263,17.168,20.181,17.873,20.089,18.759z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -21,4 +21,5 @@
<string name="handshaking">Handskudding</string>
<string name="connected">Gekoppel</string>
<string name="disconnecting">Ontkoppel</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Свързана</string>
<string name="disconnecting">Разкачане</string>
<string name="waiting_for_disconnection">Изчакване за разкачане</string>
<!-- Custom Watchface -->
</resources>

View file

@ -24,4 +24,5 @@
<string name="connected">Connectat</string>
<string name="disconnecting">Desconnectant</string>
<string name="waiting_for_disconnection">S\'està esperant la desconnexió</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,11 @@
<string name="connected">Připojeno</string>
<string name="disconnecting">Odpojuji</string>
<string name="waiting_for_disconnection">Čekám na odpojení</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Vytvořeno: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Jméno %1$s</string>
<string name="metadata_wear_import_filename">Název souboru: %1$s</string>
<string name="metadata_label_watchface_version">Verze ciferníku: %1$s</string>
<string name="wear_default_watchface">Výchozí ciferník</string>
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Tilsuttet</string>
<string name="disconnecting">Afbryder</string>
<string name="waiting_for_disconnection">Venter på afbrydelse</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Verbunden</string>
<string name="disconnecting">Verbindung wird getrennt</string>
<string name="waiting_for_disconnection">Warte auf Trennung der Verbindung</string>
<!-- Custom Watchface -->
</resources>

View file

@ -20,4 +20,5 @@
<string name="handshaking">Δημιουργία σύνδεσης</string>
<string name="connected">Συνδέθηκε</string>
<string name="disconnecting">Αποσυνδέεται</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Conectado</string>
<string name="disconnecting">Desconectando</string>
<string name="waiting_for_disconnection">Esperando la desconexión</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Connectée</string>
<string name="disconnecting">Déconnexion en cours</string>
<string name="waiting_for_disconnection">Attente de déconnexion</string>
<!-- Custom Watchface -->
</resources>

View file

@ -22,4 +22,5 @@
<string name="connecting_for">Ag nascadh le %1$d s</string>
<string name="connected">Nasctha</string>
<string name="disconnecting">Dícheangal</string>
<!-- Custom Watchface -->
</resources>

View file

@ -5,4 +5,5 @@
<string name="shortday">n</string>
<!-- Rx -->
<string name="connected">Kapcsolódva</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">Connesso</string>
<string name="disconnecting">Disconnessione</string>
<string name="waiting_for_disconnection">In attesa della disconnessione</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">מחובר</string>
<string name="disconnecting">מתנתק</string>
<string name="waiting_for_disconnection">ממתין לניתוק</string>
<!-- Custom Watchface -->
</resources>

View file

@ -33,4 +33,5 @@
<string name="connected">接続されました</string>
<string name="disconnecting">切断中</string>
<string name="waiting_for_disconnection">切断待ち</string>
<!-- Custom Watchface -->
</resources>

View file

@ -24,4 +24,5 @@
<string name="connected">Conectat</string>
<string name="disconnecting">Se deconectează</string>
<string name="waiting_for_disconnection">Se așteaptă deconectarea</string>
<!-- Custom Watchface -->
</resources>

View file

@ -148,7 +148,7 @@ android {
versionName version + "-aapsclient"
manifestPlaceholders = [
appIcon : "@mipmap/ic_yellowowl",
appIconRound: "@null"
appIconRound: "@mipmap/ic_yellowowl"
]
}
aapsclient2 {
@ -157,8 +157,8 @@ android {
resValue "string", "app_name", "AAPSClient2"
versionName version + "-aapsclient"
manifestPlaceholders = [
appIcon : "@mipmap/ic_yellowowl",
appIconRound: "@null"
appIcon : "@mipmap/ic_blueowl",
appIconRound: "@mipmap/ic_blueowl"
]
}
}

View file

@ -21,6 +21,7 @@ import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat
@ -151,7 +152,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
.subscribe({ processPreferenceChange(it) }, fabricPrivacy::logException)
if (startWizard() && !isRunningRealPumpTest()) {
protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
startActivity(Intent(this, SetupWizardActivity::class.java))
startActivity(Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
})
}
androidPermission.notifyForStoragePermission(this)
@ -163,6 +164,17 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
androidPermission.notifyForBtConnectPermission(this)
}
passwordResetCheck(this)
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START))
binding.mainDrawerLayout.closeDrawers()
else if (menuOpen)
menu?.close()
else if (binding.mainPager.currentItem != 0)
binding.mainPager.currentItem = 0
else finish()
}
})
}
private fun checkPluginPreferences(viewPager: ViewPager2) {
@ -219,9 +231,11 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
menuItem.setIcon(info.nightscout.core.ui.R.drawable.ic_settings)
}
menuItem.setOnMenuItemClickListener {
val intent = Intent(this, SingleFragmentActivity::class.java)
intent.putExtra("plugin", activePlugin.getPluginsList().indexOf(p))
startActivity(intent)
startActivity(
Intent(this, SingleFragmentActivity::class.java)
.setAction("info.nightscout.androidaps.MainActivity")
.putExtra("plugin", activePlugin.getPluginsList().indexOf(p))
)
binding.mainDrawerLayout.closeDrawers()
true
}
@ -318,26 +332,28 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
when (item.itemId) {
R.id.nav_preferences -> {
protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this, PreferencesActivity::class.java)
i.putExtra("id", -1)
startActivity(i)
startActivity(
Intent(this, PreferencesActivity::class.java)
.setAction("info.nightscout.androidaps.MainActivity")
.putExtra("id", -1)
)
})
return true
}
R.id.nav_historybrowser -> {
startActivity(Intent(this, HistoryBrowseActivity::class.java))
startActivity(Intent(this, HistoryBrowseActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
return true
}
R.id.nav_treatments -> {
startActivity(Intent(this, TreatmentsActivity::class.java))
startActivity(Intent(this, TreatmentsActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
return true
}
R.id.nav_setupwizard -> {
protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
startActivity(Intent(this, SetupWizardActivity::class.java))
startActivity(Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
})
return true
}
@ -384,9 +400,11 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
R.id.nav_plugin_preferences -> {
val plugin = (binding.mainPager.adapter as TabPageAdapter).getPluginAt(binding.mainPager.currentItem)
protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this, PreferencesActivity::class.java)
i.putExtra("id", plugin.preferencesId)
startActivity(i)
startActivity(
Intent(this, PreferencesActivity::class.java)
.setAction("info.nightscout.androidaps.MainActivity")
.putExtra("id", plugin.preferencesId)
)
})
return true
}
@ -397,35 +415,18 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
}
*/
R.id.nav_defaultprofile -> {
startActivity(Intent(this, ProfileHelperActivity::class.java))
startActivity(Intent(this, ProfileHelperActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
return true
}
R.id.nav_stats -> {
startActivity(Intent(this, StatsActivity::class.java))
startActivity(Intent(this, StatsActivity::class.java).setAction("info.nightscout.androidaps.MainActivity"))
return true
}
}
return actionBarDrawerToggle.onOptionsItemSelected(item)
}
override fun onBackPressed() {
if (binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START)) {
binding.mainDrawerLayout.closeDrawers()
return
}
if (menuOpen) {
this.menu?.close()
return
}
if (binding.mainPager.currentItem != 0) {
binding.mainPager.currentItem = 0
return
}
@Suppress("DEPRECATION")
super.onBackPressed()
}
// Correct place for calling setUserStats() would be probably MainApp
// but we need to have it called at least once a day. Thus this location

View file

@ -2,8 +2,10 @@ package info.nightscout.androidaps.activities
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuProvider
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import info.nightscout.androidaps.R
@ -33,10 +35,13 @@ class PreferencesActivity : DaggerAppCompatActivityWithResult(), PreferenceFragm
it.putInt("id", preferenceId)
}
if (savedInstanceState == null)
@Suppress("CommitTransaction")
supportFragmentManager.beginTransaction().replace(R.id.frame_layout, myPreferenceFragment!!).commit()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Add menu items without overriding methods in the Activity
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
// Add menu items here
menuInflater.inflate(R.menu.menu_preferences, menu)
val searchItem = menu.findItem(R.id.menu_search)
searchView = searchItem.actionView as SearchView
@ -47,11 +52,20 @@ class PreferencesActivity : DaggerAppCompatActivityWithResult(), PreferenceFragm
return false
}
override fun onQueryTextSubmit(query: String): Boolean {
return false
override fun onQueryTextSubmit(query: String): Boolean = false
})
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean =
when (menuItem.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
true
}
else -> false
}
})
return super.onCreateOptionsMenu(menu)
}
override fun onPreferenceStartScreen(caller: PreferenceFragmentCompat, pref: PreferenceScreen): Boolean {
@ -60,18 +74,8 @@ class PreferencesActivity : DaggerAppCompatActivityWithResult(), PreferenceFragm
it.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.key)
it.putInt("id", preferenceId)
}
@Suppress("CommitTransaction")
supportFragmentManager.beginTransaction().replace(R.id.frame_layout, fragment, pref.key).addToBackStack(pref.key).commit()
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.home -> {
@Suppress("DEPRECATION")
onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
}

View file

@ -18,6 +18,8 @@ class ConfigImpl @Inject constructor(
override val SUPPORTED_NS_VERSION = 150000 // 15.0.0
override val APS = BuildConfig.FLAVOR == "full"
override val NSCLIENT = BuildConfig.FLAVOR == "aapsclient" || BuildConfig.FLAVOR == "aapsclient2"
override val NSCLIENT1 = BuildConfig.FLAVOR == "aapsclient"
override val NSCLIENT2 = BuildConfig.FLAVOR == "aapsclient2"
override val PUMPCONTROL = BuildConfig.FLAVOR == "pumpcontrol"
override val PUMPDRIVERS = BuildConfig.FLAVOR == "full" || BuildConfig.FLAVOR == "pumpcontrol"
override val FLAVOR = BuildConfig.FLAVOR

View file

@ -20,7 +20,7 @@ buildscript {
material_version = '1.9.0'
gridlayout_version = '1.0.0'
constraintlayout_version = '2.1.4'
preferencektx_version = '1.2.0'
preferencektx_version = '1.2.1'
commonslang3_version = '3.13.0'
commonscodec_version = '1.16.0'
guava_version = '32.1.2-jre'

View file

@ -4,7 +4,9 @@ package info.nightscout.interfaces
interface Config {
val SUPPORTED_NS_VERSION: Int
val APS: Boolean
val NSCLIENT: Boolean
val NSCLIENT: Boolean // aapsclient || aapsclient2
val NSCLIENT1: Boolean // aapsclient
val NSCLIENT2: Boolean // aapsclient2
val PUMPCONTROL: Boolean
val PUMPDRIVERS: Boolean
val FLAVOR: String

View file

@ -137,6 +137,7 @@ open class Notification {
const val PATCH_NOT_ACTIVE = 83
const val PUMP_SETTINGS_FAILED = 84
const val PUMP_TIMEZONE_UPDATE_FAILED = 85
const val BLUETOOTH_NOT_SUPPORTED = 86
const val USER_MESSAGE = 1000

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -376,6 +376,9 @@
<string name="carbs_g">SACHARIDY %1$d g</string>
<string name="extended_bolus_u_min">ROZLOŽENÝ BOLUS %1$.2f U %2$d min</string>
<string name="load_events">NAČÍST UDÁLOSTI</string>
<string name="clear_alarms">SMAZAT ALARMY</string>
<string name="deactivate">DEAKTIVOVAT</string>
<string name="update_time">AKTUALIZOVAT ČAS</string>
<string name="load_history">NAČÍST HISTORII %1$d</string>
<string name="load_tdds">NAČÍST CDD</string>
<string name="set_profile">NASTAVIT PROFIL</string>
@ -453,6 +456,7 @@
<string name="cobvsiob">COB vs. IOB</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>!!!!! Detekována pomalá absorbce sacharidů: %2$d%% času. Překontrolujte kalkulaci. COB může být nadhodnocené, a proto může být započítáno více inzulínu !!!!!</font>]]></string>
<string name="partialboluswizard">Podat tuto část z výsledku kalkulace [%]</string>
<string name="partialboluswizard_reset_time">Časový limit staré glykémie [min]</string>
<string name="bolus_constraint_applied_warn">Použito omezení bolusu: %1$.2f U na %2$.2f U</string>
<string name="bolus_recorded_only">Bolus nebude pumpou vydán, pouze zaznamenán</string>
<string name="advisoralarm">Spustit alarm, když je čas na jídlo</string>

View file

@ -376,6 +376,9 @@
<string name="carbs_g">CARBOHIDRATOS %1$d g</string>
<string name="extended_bolus_u_min">BOLO EXTENDIDO %1$.2f U %2$d min</string>
<string name="load_events">CARGAR EVENTOS</string>
<string name="clear_alarms">BORRAR ALARMAS</string>
<string name="deactivate">DESACTIVAR</string>
<string name="update_time">ACTUALIZAR HORA</string>
<string name="load_history">CARGAR HISTORIAL %1$d</string>
<string name="load_tdds">CARGAR TDDs</string>
<string name="set_profile">ESTABLECER PERFIL</string>
@ -453,6 +456,7 @@
<string name="cobvsiob">COB vs IOB</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>¡Se ha detectado una absorción lenta de carbohidratos: %2$d%% de tiempo. Comprueba de nuevo el cálculo. Los COB se pueden sobrestimar, por lo que se podría administrar más insulina de la cuenta!</font>]]></string>
<string name="partialboluswizard">Administrar esta parte del resultado del asistente de bolos [%]</string>
<string name="partialboluswizard_reset_time">Antiguo umbral de tiempo de glucemia [min]</string>
<string name="bolus_constraint_applied_warn">Restricción de bolo aplicada: %1$.2f U a %2$.2f U</string>
<string name="bolus_recorded_only">El bolo sólo se anotará (no será entregado por la bomba)</string>
<string name="advisoralarm">Ejecutar alarma cuando sea hora de comer</string>

View file

@ -376,6 +376,9 @@
<string name="carbs_g">GLUCIDES %1$d g</string>
<string name="extended_bolus_u_min">BOLUS ÉTENDU %1$.2f U %2$d min</string>
<string name="load_events">CHARGER LES ÉVÉNEMENTS</string>
<string name="clear_alarms">SUPPRIMER LES ALARMES</string>
<string name="deactivate">DÉSACTIVER</string>
<string name="update_time">METTRE À JOUR L\'HEURE</string>
<string name="load_history">CHARGER L\'HISTORIQUE %1$d</string>
<string name="load_tdds">CHARGER les DTQ</string>
<string name="set_profile">DÉFINIR LE PROFIL</string>
@ -451,8 +454,9 @@
<string name="bolus_advisor">Assistant bolus</string>
<string name="bolus_advisor_message">Vous avez une glycémie élevée. Au lieu de manger maintenant, il est recommandé d\'attendre une meilleure glycémie. Voulez-vous faire un bolus de correction maintenant et avoir une alerte quand il sera temps de manger ? Dans ce cas, aucun glucide ne sera enregistré et vous devrez utiliser l\'assistant à nouveau lorsque nous vous le rappelons.</string>
<string name="cobvsiob">GA vs IA</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>!!!!! Absorption lente des glucides détectée : %2$d%% du temps. Vérifiez de nouveau votre calcul. Les GA (Glucides Actifs) peuvent être surestimés et alors plus d\'insuline pourrait être délivré !!!!!</font>]]></string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>!!!!! Absorption lente des glucides détectée dans %2$d%% des cas. Vérifiez de nouveau votre calcul. Les GA (Glucides Actifs) peuvent être surestimés et alors trop d\'insuline pourrait être injectée !!!!!</font>]]></string>
<string name="partialboluswizard">Injecter ce pourcentage du bolus calculé par lassistant [%]</string>
<string name="partialboluswizard_reset_time">Durée limite après la dernière Gly reçue pour appliquer le % de bolus [min]</string>
<string name="bolus_constraint_applied_warn">Contrainte de Bolus appliquée : %1$.2f U vers %2$.2f U</string>
<string name="bolus_recorded_only">Les bolus seront seulement enregistrés (pas délivrés par la pompe)</string>
<string name="advisoralarm">Alerter quand il est temps de manger</string>

View file

@ -376,6 +376,7 @@
<string name="carbs_g">CHO %1$d g</string>
<string name="extended_bolus_u_min">BOLO ESTESO %1$.2f U %2$d min</string>
<string name="load_events">CARICA EVENTI</string>
<string name="deactivate">DISATTIVA</string>
<string name="load_history">CARICA STORICO %1$d</string>
<string name="load_tdds">CARICA TDD</string>
<string name="set_profile">IMPOSTA PROFILO</string>
@ -453,6 +454,7 @@
<string name="cobvsiob">COB vs IOB</string>
<string name="slowabsorptiondetected"><![CDATA[<font color=\'%1$s\'>!!!!! Rilevato assorbimento lento dei carboidrati: %2$d%% del tempo. Ricontrolla il tuo calcolo. COB potrebbero essere sovrastimati e potrebbe essere somministrata più insulina !!!!!</font>]]></string>
<string name="partialboluswizard">Eroga parte del risultato del calcolatore [%]</string>
<string name="partialboluswizard_reset_time">Soglia tempo glicemia \"vecchia\" [min]</string>
<string name="bolus_constraint_applied_warn">Vincolo bolo applicato: %1$.2f U a %2$.2f U</string>
<string name="bolus_recorded_only">Il bolo sarà solo registrato (non erogato dal micro)</string>
<string name="advisoralarm">Esegui allarme quando è tempo di mangiare</string>

View file

@ -23,7 +23,7 @@
<string name="mgdl">мг/дл</string>
<string name="mmol">ммоль/л</string>
<string name="save">Сохранить</string>
<string name="snooze">Отложить</string>
<string name="snooze">Убрать оповещение</string>
<string name="virtual_pump">Виртуальная помпа</string>
<string name="constraints">Ограничения</string>
<string name="superbolus">Суперболюс</string>
@ -527,7 +527,7 @@
<string name="message">Сообщение</string>
<string name="ok">OK</string>
<string name="cancel">Отменить</string>
<string name="dismiss">ОТКЛОНИТЬ</string>
<string name="dismiss">УБРАТЬ</string>
<string name="yes">Да</string>
<string name="no">Нет</string>
<string name="close">Закрыть</string>

View file

@ -11,7 +11,8 @@ class IconsProviderImplementation @Inject constructor(private val config: Config
override fun getIcon(): Int =
when {
config.NSCLIENT -> info.nightscout.core.ui.R.mipmap.ic_yellowowl
config.NSCLIENT2 -> info.nightscout.core.ui.R.mipmap.ic_blueowl
config.NSCLIENT1 -> info.nightscout.core.ui.R.mipmap.ic_yellowowl
config.PUMPCONTROL -> info.nightscout.core.ui.R.mipmap.ic_pumpcontrol
else -> info.nightscout.core.ui.R.mipmap.ic_launcher
}

View file

@ -70,9 +70,9 @@
<string name="enable_smb_with_temp_target_summary">Activer les SMB lorsqu\'il y a une cible temporaire active (repas imminent, exercise)</string>
<string name="enable_smb_with_high_temp_target">Activer les SMB avec cibles temp hautes</string>
<string name="enable_smb_with_high_temp_target_summary">Activer les SMB quand il y a une cible temp haute active (exercise, au dessus de 100 mg/dl ou 5.5 mmol/l)</string>
<string name="smb_max_minutes_summary">Max minutes de basal pour limiter le SMB</string>
<string name="smb_max_minutes_summary">Max minutes de basal comme limite des SMB</string>
<string name="uam_smb_max_minutes">SMB RNS minutes max</string>
<string name="uam_smb_max_minutes_summary">Minutes de basal max pour limiter les SMB des RNS</string>
<string name="uam_smb_max_minutes_summary">Minutes de basal max comme limite des SMB pendant les RNS</string>
<string name="carbs_req_threshold">Glucides minimum requis pour suggestion</string>
<string name="carbs_req_threshold_summary">Quantité de glucides minimum en g pour afficher une alerte de suggestion de glucides. Les suggestions inférieures ne déclencheront pas de notification.</string>
<string name="lgs_threshold_summary">Valeur glycémique au-dessous de laquelle l\'injection de l\'insuline est suspendu. La valeur par défaut utilise le modèle standard de la cible. L\'utilisateur peut choisir entre 60mg/dl (3.3mmol/l) et 100mg/dl (5.5mmol/l). Les valeurs au-dessous de 65/3.6 déclenchent l\'utilisation du modèle standard</string>

View file

@ -92,6 +92,7 @@
<string name="lastboluscompared">Ora ultimo bolo %1$s %2$s min fa</string>
<string name="triggercoblabel">COB</string>
<string name="cobcompared">COB %1$s %2$.0f</string>
<string name="triggerHeartRate">Frequenza cardiaca</string>
<string name="iob_u">IOB [U]:</string>
<string name="distance_short">Dist [m]:</string>
<string name="recurringTime">Tempo ricorrente</string>

View file

@ -92,6 +92,8 @@
<string name="lastboluscompared">Siste bolus for %1$s %2$s min siden</string>
<string name="triggercoblabel">COB</string>
<string name="cobcompared">COB %1$s %2$.0f</string>
<string name="triggerHeartRate">Puls</string>
<string name="triggerHeartRateDesc">HR %1$s %2$.0f</string>
<string name="iob_u">IOB [U]:</string>
<string name="distance_short">Dist [m]:</string>
<string name="recurringTime">Gjentakende tidspunkt</string>

View file

@ -92,6 +92,8 @@
<string name="lastboluscompared">Время болюса %1$s %2$s мин назад</string>
<string name="triggercoblabel">Активн углеводы</string>
<string name="cobcompared">Активн углеводы %1$s %2$.0f</string>
<string name="triggerHeartRate">Частота сердечных сокращений</string>
<string name="triggerHeartRateDesc">ЧСС%1$s%2$.0f</string>
<string name="iob_u">Акт инс IOB [U]:</string>
<string name="distance_short">Расст [м]:</string>
<string name="recurringTime">Время повторения</string>

View file

@ -3,7 +3,9 @@ package info.nightscout.configuration.activities
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.core.view.MenuProvider
import info.nightscout.configuration.R
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.plugin.PluginBase
@ -33,29 +35,32 @@ class SingleFragmentActivity : DaggerAppCompatActivityWithResult() {
supportFragmentManager.fragmentFactory.instantiate(ClassLoader.getSystemClassLoader(), plugin?.pluginDescription?.fragmentClass!!)
).commit()
}
// Add menu items without overriding methods in the Activity
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
if (plugin?.preferencesId != -1) menuInflater.inflate(R.menu.menu_single_fragment, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
override fun onMenuItemSelected(menuItem: MenuItem): Boolean =
when (menuItem.itemId) {
android.R.id.home -> {
finish()
onBackPressedDispatcher.onBackPressed()
true
}
R.id.nav_plugin_preferences -> {
protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this, uiInteraction.preferencesActivity)
i.putExtra("id", plugin?.preferencesId)
protectionCheck.queryProtection(this@SingleFragmentActivity, ProtectionCheck.Protection.PREFERENCES, {
val i = Intent(this@SingleFragmentActivity, uiInteraction.preferencesActivity)
.setAction("info.nightscout.configuration.activities.SingleFragmentActivity")
.putExtra("id", plugin?.preferencesId)
startActivity(i)
}, null)
true
}
else -> super.onOptionsItemSelected(item)
else -> false
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (plugin?.preferencesId != -1) menuInflater.inflate(R.menu.menu_single_fragment, menu)
return super.onCreateOptionsMenu(menu)
})
}
}

View file

@ -3,9 +3,12 @@ package info.nightscout.configuration.maintenance.activities
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.core.view.MenuProvider
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@ -41,6 +44,21 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() {
binding.recyclerview.layoutManager = LinearLayoutManager(this)
binding.recyclerview.adapter = RecyclerViewAdapter(prefFileListProvider.listPreferenceFiles(loadMetadata = true))
// Add menu items without overriding methods in the Activity
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean =
when (menuItem.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
true
}
else -> false
}
})
}
inner class RecyclerViewAdapter internal constructor(private var prefFileList: List<PrefsFile>) : RecyclerView.Adapter<RecyclerViewAdapter.PrefFileViewHolder>() {
@ -106,12 +124,4 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() {
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
}

View file

@ -4,6 +4,7 @@ import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import dagger.android.HasAndroidInjector
import info.nightscout.configuration.R
import info.nightscout.configuration.activities.DaggerAppCompatActivityWithResult
@ -64,6 +65,12 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() {
generateLayout()
updateButtons()
}
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (currentWizardPage == 0)
OKDialog.showConfirmation(this@SetupWizardActivity, rh.gs(R.string.exitwizard)) { finish() } else showPreviousPage(null)
}
})
}
override fun onPause() {
@ -134,10 +141,6 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() {
}
}
override fun onBackPressed() {
if (currentWizardPage == 0) OKDialog.showConfirmation(this, rh.gs(R.string.exitwizard)) { finish() } else showPreviousPage(null)
}
@Suppress("UNUSED_PARAMETER")
fun exitPressed(view: View?) {
sp.putBoolean(R.string.key_setupwizard_processed, true)
@ -147,7 +150,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() {
@Suppress("UNUSED_PARAMETER")
fun showNextPage(view: View?) {
finish()
val intent = Intent(this, SetupWizardActivity::class.java)
val intent = Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity")
intent.putExtra(intentMessage, nextPage(null))
startActivity(intent)
}
@ -155,7 +158,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() {
@Suppress("UNUSED_PARAMETER")
fun showPreviousPage(view: View?) {
finish()
val intent = Intent(this, SetupWizardActivity::class.java)
val intent = Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity")
intent.putExtra(intentMessage, previousPage(null))
startActivity(intent)
}
@ -164,7 +167,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() {
@Suppress("UNUSED_PARAMETER")
fun finishSetupWizard(view: View?) {
sp.putBoolean(R.string.key_setupwizard_processed, true)
val intent = Intent(this, uiInteraction.mainActivity)
val intent = Intent(this, uiInteraction.mainActivity).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
finish()

View file

@ -243,6 +243,7 @@
<string name="short_tabtitles">Krátké názvy modulů</string>
<string name="overview_show_notes_field_in_dialogs_title">Zobrazovat kolonku poznámky v dialozích ošetření</string>
<string name="deliverpartofboluswizard">Kalkulátor provede výpočet, ale dodána je pouze tato část inzulínu. Výhodné při používání SMB algoritmu.</string>
<string name="deliver_part_of_boluswizard_reset_time">Vydat celý bolus (100%), pokud je glykémie starší než</string>
<string name="enable_bolus_advisor">Povolit poradce s bolusem</string>
<string name="enable_bolus_advisor_summary">Při vysoké glykémii použijte připomenutí, abyste začali jíst později, namísto výsledku z kalkulátoru („prebolus“)</string>
<string name="enablesuperbolus">Povolit superbolus</string>
@ -315,6 +316,11 @@
<string name="wear_notifysmb_summary">Ukazovat SMB na hodinkách jako normální bolus.</string>
<string name="wear_predictions_summary">Zobrazovat predikce na hodinkách.</string>
<string name="wear_predictions_title">Predikce</string>
<string name="wear_custom_watchface">Vlastní ciferník: %1$s</string>
<string name="wear_load_watchface">Nahrát ciferník</string>
<string name="wear_send_watchface">Odeslat ciferník</string>
<string name="wear_export_watchface">Exportovat ciferník</string>
<string name="wear_new_custom_watchface_exported">Vlastní ciferník exportován</string>
<string name="resend_all_data">Znovu poslat všechna data</string>
<string name="open_settings_on_wear">Otevřít nastavení na hodinkách Wear</string>
<!-- PersistentNotification-->

View file

@ -243,6 +243,7 @@
<string name="short_tabtitles">Nombres cortos en pestañas</string>
<string name="overview_show_notes_field_in_dialogs_title">Mostrar el campo notas en diálogos de tratamientos</string>
<string name="deliverpartofboluswizard">El asistente de bolos realiza el cálculo, pero solo se entrega esta parte de la insulina calculada. Útil con el algoritmo SMB.</string>
<string name="deliver_part_of_boluswizard_reset_time">Administrar bolo completo (100%) si la glucemia es mayor de</string>
<string name="enable_bolus_advisor">Habilitar asistente de bolo</string>
<string name="enable_bolus_advisor_summary">Utiliza un recordatorio para empezar a comer más tarde, en lugar del resultado del asistente durante una glucemia alta (\"pre-bolo\")</string>
<string name="enablesuperbolus">Activar superbolo en asistente</string>

View file

@ -243,6 +243,7 @@
<string name="short_tabtitles">Raccourcir les titres des onglets</string>
<string name="overview_show_notes_field_in_dialogs_title">Affiche les notes dans les dialogues</string>
<string name="deliverpartofboluswizard">L\'assistant bolus effectue le calcul mais seulement ce pourcentage de l\'insuline calculée est délivré. Utile avec l\'algorithme SMB.</string>
<string name="deliver_part_of_boluswizard_reset_time">Faire un bolus complet (100%) si la glycémie est plus ancienne que</string>
<string name="enable_bolus_advisor">Activer l\'assistant bolus</string>
<string name="enable_bolus_advisor_summary">Utiliser un rappel pour commencer le repas à la place du résultat de l\'assistant quand la glycémie est élevée (\"pré-bolus\")</string>
<string name="enablesuperbolus">Activer les Superbolus dans lAssistant</string>

View file

@ -243,6 +243,7 @@
<string name="short_tabtitles">Accorcia titoli schede</string>
<string name="overview_show_notes_field_in_dialogs_title">Finestre tratt.nto: mostra campo note</string>
<string name="deliverpartofboluswizard">Il calcolatore esegue il calcolo, ma solo questa parte dell\'insulina calcolata è erogata. Utile con algoritmo SMB.</string>
<string name="deliver_part_of_boluswizard_reset_time">Eroga bolo completo (100%) se la glicemia è più \"vecchia\" di</string>
<string name="enable_bolus_advisor">Abilita consiglio bolo</string>
<string name="enable_bolus_advisor_summary">Usa un promemoria per iniziare a mangiare invece del risultato del calcolatore durante la glicemia alta (\"pre-bolo\")</string>
<string name="enablesuperbolus">Abilita superbolo nel calcolatore</string>

View file

@ -3,11 +3,15 @@ package info.nightscout.plugins.sync.openhumans.ui
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.CheckBox
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.view.MenuProvider
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
@ -94,6 +98,25 @@ class OHLoginActivity : TranslatedDaggerAppCompatActivity() {
if (code != null) {
viewModel.submitBearerToken(code)
}
// Add menu items without overriding methods in the Activity
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean =
when (menuItem.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
true
}
else -> false
}
})
onBackPressedDispatcher.addCallback(this, object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!viewModel.goBack()) finish()
}
})
}
override fun onNewIntent(intent: Intent) {
@ -103,21 +126,4 @@ class OHLoginActivity : TranslatedDaggerAppCompatActivity() {
viewModel.submitBearerToken(code)
}
}
override fun onBackPressed() {
if (!viewModel.goBack()) {
@Suppress("DEPRECATION")
super.onBackPressed()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
if (item.itemId == android.R.id.home) {
@Suppress("DEPRECATION")
onBackPressed()
true
} else {
super.onOptionsItemSelected(item)
}
}

View file

@ -12,6 +12,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.comboctl.android.AndroidBluetoothInterface
import info.nightscout.comboctl.base.BasicProgressStage
import info.nightscout.comboctl.base.BluetoothException
import info.nightscout.comboctl.base.BluetoothNotAvailableException
import info.nightscout.comboctl.base.BluetoothNotEnabledException
import info.nightscout.comboctl.base.ComboException
import info.nightscout.comboctl.base.DisplayFrame
@ -346,10 +347,24 @@ class ComboV2Plugin @Inject constructor (
_pairedStateUIFlow.value = paired
pumpManager = newPumpManager
} catch (_: BluetoothNotAvailableException) {
uiInteraction.addNotification(
Notification.BLUETOOTH_NOT_SUPPORTED,
text = rh.gs(R.string.combov2_bluetooth_not_supported),
level = Notification.URGENT
)
// Deliberately _not_ setting the driver state here before
// exiting this scope. We are essentially aborting the start
// since Bluetooth is not supported by the hardware, so the
// driver cannot do anything, and therefore cannot leave the
// DriverState.NotInitialized state.
aapsLogger.error(LTag.PUMP, "combov2 driver start cannot be completed since the hardware does not support Bluetooth")
return@runWithPermissionCheck
} catch (_: BluetoothNotEnabledException) {
uiInteraction.addNotification(
Notification.BLUETOOTH_NOT_ENABLED,
text = rh.gs(info.nightscout.core.ui.R.string.ble_not_enabled),
text = rh.gs(R.string.combov2_bluetooth_disabled),
level = Notification.INFO
)
@ -761,7 +776,7 @@ class ComboV2Plugin @Inject constructor (
} catch (_: BluetoothNotEnabledException) {
uiInteraction.addNotification(
Notification.BLUETOOTH_NOT_ENABLED,
text = rh.gs(info.nightscout.core.ui.R.string.ble_not_enabled),
text = rh.gs(R.string.combov2_bluetooth_disabled),
level = Notification.INFO
)
} catch (e: Exception) {

View file

@ -9,6 +9,7 @@ import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
@ -17,9 +18,11 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import info.nightscout.comboctl.base.BasicProgressStage
import info.nightscout.comboctl.base.PAIRING_PIN_SIZE
import info.nightscout.comboctl.base.PairingPIN
import info.nightscout.core.ui.activities.TranslatedDaggerAppCompatActivity
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.pump.combov2.ComboV2Plugin
import info.nightscout.pump.combov2.R
import info.nightscout.pump.combov2.databinding.Combov2PairingActivityBinding
@ -184,13 +187,13 @@ class ComboV2PairingActivity : TranslatedDaggerAppCompatActivity() {
.launchIn(this)
}
}
}
override fun onBackPressed() {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
aapsLogger.info(LTag.PUMP, "User pressed the back button; cancelling any ongoing pairing")
combov2Plugin.cancelPairing()
@Suppress("DEPRECATION")
super.onBackPressed()
finish()
}
})
}
override fun onDestroy() {
@ -334,6 +337,10 @@ class ComboV2PairingActivity : TranslatedDaggerAppCompatActivity() {
// We need to skip whitespaces since the
// TextWatcher above inserts some.
val pinString = binding.combov2PinEntryEdit.text.replace(whitespaceRemovalRegex, "")
if (pinString.length != PAIRING_PIN_SIZE) {
ToastUtils.showToastInUiThread(this, rh.gs(R.string.combov2_pairing_invalid_pin_length, PAIRING_PIN_SIZE, pinString.length))
return@setOnClickListener
}
runBlocking {
val PIN = PairingPIN(pinString.map { it - '0' }.toIntArray())
combov2Plugin.providePairingPIN(PIN)

View file

@ -47,6 +47,7 @@ Pokud po více než ~5 minutách není navázáno žádné spojení:\n\n
<string name="combov2_pairing_combo_scan_timeout_reached">Časový limit pro vyhledávání Combo dosažen</string>
<string name="combov2_pairing_failed_due_to_error">Párování se nezdařilo z důvodu chyby: %1$s</string>
<string name="combov2_pairing_aborted_unknown_reasons">Párování přerušeno z neznámých důvodů</string>
<string name="combov2_pairing_invalid_pin_length">"Neplatná délka PINu párování: potřeba %1$d číslic, zadáno %2$d"</string>
<string name="combov2_scanning_for_pump">Vyhledávání pumpy</string>
<string name="combov2_establishing_bt_connection">Navazování připojení Bluetooth (pokus č. %1$d)</string>
<string name="combov2_pairing_performing_handshake">Provádím navazování spojení s pumpou</string>
@ -124,4 +125,6 @@ Pokud po více než ~5 minutách není navázáno žádné spojení:\n\n
<string name="combov2_refresh_pump_status_after_error">Obnovování stavu pumpy po nahlášení chyby</string>
<string name="combov2_go_back">Zpět</string>
<string name="combov2_cannot_pair_driver_not_initialized_explanation">Nelze provést párování, protože ovladač není inicializován. To se obvykle stává, protože nebyla udělena potřebná oprávnění Bluetooth. Jděte zpět, udělte oprávnění Bluetooth, pak zkuste znovu spárovat.</string>
<string name="combov2_bluetooth_disabled">Nelze spustit ovladač - Bluetooth je zakázáno</string>
<string name="combov2_bluetooth_not_supported">Ovladač nelze spustit - toto zařízení nepodporuje Bluetooth</string>
</resources>

View file

@ -47,6 +47,7 @@ Si no puedes establecer ninguna conexión después de unos ~5 minutos:\n\n
<string name="combov2_pairing_combo_scan_timeout_reached">Tiempo de espera de escaneo alcanzado</string>
<string name="combov2_pairing_failed_due_to_error">No se pudo emparejar debido al error: %1$s</string>
<string name="combov2_pairing_aborted_unknown_reasons">Emparejamiento abortado por razones desconocidas</string>
<string name="combov2_pairing_invalid_pin_length">"Longitud del PIN de emparejamiento inválida: Necesita %1$d digits, obtuvo %2$d"</string>
<string name="combov2_scanning_for_pump">Buscando bomba</string>
<string name="combov2_establishing_bt_connection">Estableciendo conexión Bluetooth (intento número %1$d)</string>
<string name="combov2_pairing_performing_handshake">Realizando emparejamiento con la bomba</string>
@ -124,4 +125,6 @@ Si no puedes establecer ninguna conexión después de unos ~5 minutos:\n\n
<string name="combov2_refresh_pump_status_after_error">Actualizando el estado de la bomba después de que informara de un error</string>
<string name="combov2_go_back">Retroceder</string>
<string name="combov2_cannot_pair_driver_not_initialized_explanation">No se puede realizar el emparejamiento porque el controlador no está inicializado. Esto suele ocurrir porque no se han concedido los permisos Bluetooth necesarios. Vuelve atrás, concede los permisos Bluetooth e intenta de nuevo el emparejamiento</string>
<string name="combov2_bluetooth_disabled">No se puede iniciar el controlador - El bluetooth está desactivado</string>
<string name="combov2_bluetooth_not_supported">El controlador no puede ejecutarse - este dispositivo no es compatible con Bluetooth</string>
</resources>

View file

@ -97,6 +97,7 @@ Se non viene stabilita alcuna connessione dopo più di ~5 minuti:\n\n
<string name="combov2_set_emulated_100_tbr">Imposta TBR 100% (emulato)</string>
<string name="combov2_letting_emulated_100_tbr_finish">Lasciando finire il TBR 100% (emulato) in esecuzione</string>
<string name="combov2_ignoring_redundant_100_tbr">TBR 100%: ignorando la richiesta ridondante</string>
<string name="combov2_hit_unexpected_tbr_limit">Limite inatteso riscontrato durante la regolazione di TBR: la percentuale target era %1$d%%, raggiunto un limite a %2$d%%</string>
<string name="combov2_cannot_set_absolute_tbr_if_basal_zero">Impossibile impostare un TBR assoluto se la velocità basale di base è zero</string>
<string name="combov2_pair_with_pump_summary">Associa AndroidAPS e Android con un micro Accu-Chek Combo attualmente non associato</string>
<string name="combov2_unpair_pump_summary">Disassocia AndroidAPS e Android dal micro Accu-Chek Combo attualmente associato</string>

View file

@ -90,6 +90,7 @@
<string name="combov2_set_emulated_100_tbr">הגדר בזאלי זמני 100% מדומה</string>
<string name="combov2_letting_emulated_100_tbr_finish">מאפשר לבזאלי הזמני 100% המדומה לסיים</string>
<string name="combov2_ignoring_redundant_100_tbr">מתעלם מבקשה מיותרת של בזאלי זמני 100%</string>
<string name="combov2_hit_unexpected_tbr_limit">נמצאה מגבלה בלתי צפוי בעת הגדרת בזאלי זמני: אחוז המטרה היה %1$d%% והגיע למגבלה ב-%2$d%%</string>
<string name="combov2_cannot_set_absolute_tbr_if_basal_zero">לא ניתן להגדיר בזאלי זמני אם המינון הבזאלי הבסיסי הוא 0</string>
<string name="combov2_pair_with_pump_summary">צימוד AndroidAPS ואנדרואיד עם משאבת Accu-Chek combo שאינה מצומדת</string>
<string name="combov2_unpair_pump_summary">ביטול צימוד AndroidAPS ואנדרואיד ממשאבת Accu-Chek combo המצומדת</string>

View file

@ -98,6 +98,7 @@ knappene samtidig for å avbryte parringen)\n
<string name="combov2_set_emulated_100_tbr">Angi emulert 100% TBR</string>
<string name="combov2_letting_emulated_100_tbr_finish">Lar aktive emulert 100% TBR få avslutte</string>
<string name="combov2_ignoring_redundant_100_tbr">Ignorerer redundant 100% TBR forespørsel</string>
<string name="combov2_hit_unexpected_tbr_limit">Uventet begrensning oppsto ved justering av TBR: målprosenten var %1$d%%, nådde grense på %2$d%%</string>
<string name="combov2_cannot_set_absolute_tbr_if_basal_zero">Kan ikke sette absolutt TBR hvis basalraten er null</string>
<string name="combov2_pair_with_pump_summary">Sammenkoble AndroidAPS og Android med en ikke-tilkoblet Accu-Chek Combo pumpe</string>
<string name="combov2_unpair_pump_summary">Koble fra AndroidAPS og Android fra den ilkoblede Accu-Chek Combo pumpen</string>

View file

@ -98,6 +98,7 @@
<string name="combov2_set_emulated_100_tbr">Установить эмуляцию. временного базала TBR 100%</string>
<string name="combov2_letting_emulated_100_tbr_finish">Позволить завершиться текущей эмуляции временного базала 100% TBR</string>
<string name="combov2_ignoring_redundant_100_tbr">Игнорирование избыточного запроса на 100% TBR</string>
<string name="combov2_hit_unexpected_tbr_limit">При настройке ВБС: обнаружен непредвиденный предел: целевой процент %1$d%%, достиг предела %2$d%%</string>
<string name="combov2_cannot_set_absolute_tbr_if_basal_zero">Невозможно установить абсолютный TBR, если базовая скорость равна нулю</string>
<string name="combov2_pair_with_pump_summary">Выполнить сопряжение AndroidAPS и Android с помпой Accu-Chek Combo</string>
<string name="combov2_unpair_pump_summary">Отключить AndroidAPS и AndroidAPS от помпы Accu-Chek Combo</string>

View file

@ -53,6 +53,7 @@ buttons at the same time to cancel pairing)\n
<string name="combov2_pairing_combo_scan_timeout_reached">Combo scan timeout reached</string>
<string name="combov2_pairing_failed_due_to_error">Pairing failed due to error: %1$s</string>
<string name="combov2_pairing_aborted_unknown_reasons">Pairing aborted for unknown reasons</string>
<string name="combov2_pairing_invalid_pin_length">"Invalid pairing PIN length: need %1$d digits, got %2$d"</string>
<string name="combov2_scanning_for_pump">Scanning for pump</string>
<string name="combov2_establishing_bt_connection">Establishing Bluetooth connection (attempt no. %1$d)</string>
<string name="combov2_pairing_performing_handshake">Performing handshake with pump</string>
@ -139,4 +140,6 @@ buttons at the same time to cancel pairing)\n
<string name="combov2_refresh_pump_status_after_error">Refreshing pump status after the pump reported an error</string>
<string name="combov2_go_back">Go back</string>
<string name="combov2_cannot_pair_driver_not_initialized_explanation">Cannot perform pairing because the driver is not initialized. This typically happens because the necessary Bluetooth permissions have not been granted. Go back, grant the Bluetooth permissions, then try again to pair.</string>
<string name="combov2_bluetooth_disabled">Cannot start driver - Bluetooth is disabled</string>
<string name="combov2_bluetooth_not_supported">Driver cannot run - this device does not support Bluetooth</string>
</resources>

View file

@ -6,6 +6,7 @@ import android.content.Intent
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.view.MotionEvent
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.eopatch.R
@ -103,6 +104,16 @@ class EopatchActivity : EoBaseActivity<ActivityEopatchBinding>() {
}
}
}
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
binding.viewModel?.apply {
when (patchStep.value) {
PatchStep.SAFE_DEACTIVATION -> this@EopatchActivity.finish()
else -> Unit
}
}
}
})
}
override fun onNewIntent(intent: Intent?) {
@ -274,15 +285,6 @@ class EopatchActivity : EoBaseActivity<ActivityEopatchBinding>() {
this@EopatchActivity.finish()
}
override fun onBackPressed() {
binding.viewModel?.apply{
when(patchStep.value){
PatchStep.SAFE_DEACTIVATION -> this@EopatchActivity.finish()
else -> Unit
}
}
}
companion object {
const val RESULT_DISCARDED = RESULT_FIRST_USER + 1
const val EXTRA_START_PATCH_STEP = "EXTRA_START_PATCH_FRAGMENT_UI"

View file

@ -293,12 +293,12 @@ import kotlin.math.abs
val pumpRate = constraintChecker.applyBasalConstraints(Constraint(absoluteRate), profile).value()
temporaryBasalStorage.add(PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.mins(durationInMinutes.toLong()).msecs(), pumpRate, true, tbrType, 0L, 0L))
val connectionOK = medtrumService?.setTempBasal(pumpRate, durationInMinutes) ?: false
if (connectionOK
return if (connectionOK
&& medtrumPump.tempBasalInProgress
&& Math.abs(medtrumPump.tempBasalAbsoluteRate - pumpRate) <= 0.05
&& abs(medtrumPump.tempBasalAbsoluteRate - pumpRate) <= 0.05
) {
return PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(medtrumPump.tempBasalAbsoluteRate)
PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(medtrumPump.tempBasalAbsoluteRate)
.isPercent(false)
.isTempCancel(false)
} else {
@ -306,7 +306,7 @@ import kotlin.math.abs
LTag.PUMP,
"setTempBasalAbsolute failed, connectionOK: $connectionOK, tempBasalInProgress: ${medtrumPump.tempBasalInProgress}, tempBasalAbsoluteRate: ${medtrumPump.tempBasalAbsoluteRate}"
)
return PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum setTempBasalAbsolute failed")
PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum setTempBasalAbsolute failed")
}
}
@ -325,11 +325,11 @@ import kotlin.math.abs
aapsLogger.info(LTag.PUMP, "cancelTempBasal - enforceNew: $enforceNew")
val connectionOK = medtrumService?.cancelTempBasal() ?: false
if (connectionOK && !medtrumPump.tempBasalInProgress) {
return PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)
return if (connectionOK && !medtrumPump.tempBasalInProgress) {
PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)
} else {
aapsLogger.error(LTag.PUMP, "cancelTempBasal failed, connectionOK: $connectionOK, tempBasalInProgress: ${medtrumPump.tempBasalInProgress}")
return PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum cancelTempBasal failed")
PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum cancelTempBasal failed")
}
}
@ -436,7 +436,7 @@ import kotlin.math.abs
if (isInitialized()) {
commandQueue.updateTime(object : Callback() {
override fun run() {
if (this.result.success == false) {
if (!this.result.success) {
aapsLogger.error(LTag.PUMP, "Medtrum time update failed")
// Only notify here on failure (connection may be failed), service will handle success
medtrumService?.timeUpdateNotification(false)

View file

@ -291,11 +291,11 @@ class MedtrumPump @Inject constructor(
}
fun loadUserSettingsFromSP() {
desiredPatchExpiration = sp.getBoolean(info.nightscout.pump.medtrum.R.string.key_patch_expiration, false)
val alarmSettingCode = sp.getString(info.nightscout.pump.medtrum.R.string.key_alarm_setting, AlarmSetting.LIGHT_VIBRATE_AND_BEEP.code.toString()).toByte()
desiredPatchExpiration = sp.getBoolean(R.string.key_patch_expiration, false)
val alarmSettingCode = sp.getString(R.string.key_alarm_setting, AlarmSetting.LIGHT_VIBRATE_AND_BEEP.code.toString()).toByte()
desiredAlarmSetting = AlarmSetting.values().firstOrNull { it.code == alarmSettingCode } ?: AlarmSetting.LIGHT_VIBRATE_AND_BEEP
desiredHourlyMaxInsulin = sp.getInt(info.nightscout.pump.medtrum.R.string.key_hourly_max_insulin, 40)
desiredDailyMaxInsulin = sp.getInt(info.nightscout.pump.medtrum.R.string.key_daily_max_insulin, 180)
desiredHourlyMaxInsulin = sp.getInt(R.string.key_hourly_max_insulin, 40)
desiredDailyMaxInsulin = sp.getInt(R.string.key_daily_max_insulin, 180)
_pumpSN = pumpSNFromSP
}
@ -502,11 +502,11 @@ class MedtrumPump @Inject constructor(
AlarmState.PUMP_LOW_BATTERY -> R.string.alarm_pump_low_battery
AlarmState.PUMP_LOW_RESERVOIR -> R.string.alarm_pump_low_reservoir
AlarmState.PUMP_EXPIRES_SOON -> R.string.alarm_pump_expires_soon
AlarmState.LOWBG_SUSPENDED -> R.string.alarm_lowbg_suspended
AlarmState.LOWBG_SUSPENDED2 -> R.string.alarm_lowbg_suspended2
AlarmState.LOW_BG_SUSPENDED -> R.string.alarm_low_bg_suspended
AlarmState.LOW_BG_SUSPENDED2 -> R.string.alarm_low_bg_suspended2
AlarmState.AUTO_SUSPENDED -> R.string.alarm_auto_suspended
AlarmState.HMAX_SUSPENDED -> R.string.alarm_hmax_suspended
AlarmState.DMAX_SUSPENDED -> R.string.alarm_dmax_suspended
AlarmState.HOURLY_MAX_SUSPENDED -> R.string.alarm_hourly_max_suspended
AlarmState.DAILY_MAX_SUSPENDED -> R.string.alarm_daily_max_suspended
AlarmState.SUSPENDED -> R.string.alarm_suspended
AlarmState.PAUSED -> R.string.alarm_paused
AlarmState.OCCLUSION -> R.string.alarm_occlusion
@ -528,10 +528,10 @@ class MedtrumPump @Inject constructor(
private fun loadActiveAlarms() {
val alarmsStr = sp.getString(R.string.key_active_alarms, "")
if (alarmsStr.isNullOrEmpty()) {
activeAlarms = EnumSet.noneOf(AlarmState::class.java)
activeAlarms = if (alarmsStr.isEmpty()) {
EnumSet.noneOf(AlarmState::class.java)
} else {
activeAlarms = alarmsStr.split(",")
alarmsStr.split(",")
.mapNotNull { AlarmState.values().find { alarm -> alarm.name == it } }
.let { EnumSet.copyOf(it) }
}

View file

@ -1,20 +1,7 @@
package info.nightscout.pump.medtrum.bindingadapters
import android.view.View
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.databinding.BindingAdapter
import info.nightscout.pump.medtrum.extension.setVisibleOrGone
@BindingAdapter("android:visibility")
fun setVisibility(view: View, visible: Boolean) {
view.setVisibleOrGone(visible)
}
@BindingAdapter("visibleOrGone")
fun setVisibleOrGone(view: View, visibleOrGone: Boolean) {
view.setVisibleOrGone(visibleOrGone)
}
@BindingAdapter("onSafeClick")
fun View.setOnSafeClickListener(clickListener: View.OnClickListener?) {
@ -22,8 +9,3 @@ fun View.setOnSafeClickListener(clickListener: View.OnClickListener?) {
setOnClickListener(OnSafeClickListener(it))
} ?: setOnClickListener(null)
}
@BindingAdapter("textColor")
fun setTextColor(view: TextView, @ColorRes colorResId: Int) {
view.setTextColor(view.context.getColor(colorResId))
}

View file

@ -3,7 +3,7 @@ package info.nightscout.pump.medtrum.comm
import kotlin.experimental.and
import info.nightscout.pump.medtrum.extension.toLong
class ManufacturerData(private val manufacturerDataBytes: ByteArray) {
class ManufacturerData(manufacturerDataBytes: ByteArray) {
private var deviceID: Long = 0
private var deviceType = 0
private var version = 0
@ -12,7 +12,7 @@ class ManufacturerData(private val manufacturerDataBytes: ByteArray) {
setData(manufacturerDataBytes)
}
fun setData(inputData: ByteArray) {
private fun setData(inputData: ByteArray) {
var index = 0
val deviceIDBytes: ByteArray = inputData.copyOfRange(index, index + 4)
deviceID = deviceIDBytes.toLong()

View file

@ -9,21 +9,20 @@ class WriteCommandPackets(data: ByteArray, sequenceNumber: Int) {
init {
// PackageIndex: 0 initially, if there are multiple packets, for the first packet it is set to 0 (not included in CRC calculation but sent in actual header)
var pkgIndex = 0
var header = byteArrayOf(
val header = byteArrayOf(
(data.size + 4).toByte(),
data[0],
sequenceNumber.toByte(),
pkgIndex.toByte()
0.toByte() // pkgIndex
)
var tmp: ByteArray = header + data.copyOfRange(1, data.size)
var totalCommand: ByteArray = tmp + calcCrc8(tmp, tmp.size).toByte()
val totalCommand: ByteArray = tmp + calcCrc8(tmp, tmp.size).toByte()
if ((totalCommand.size - header.size) <= 15) {
packages.add(totalCommand + 0.toByte())
} else {
pkgIndex = 1
var pkgIndex = 1
var remainingCommand = totalCommand.copyOfRange(4, totalCommand.size)
while (remainingCommand.size > 15) {
@ -52,13 +51,13 @@ class WriteCommandPackets(data: ByteArray, sequenceNumber: Int) {
}
fun allPacketsConsumed(): Boolean {
return !(index < packages.size)
return index >= packages.size
}
private fun calcCrc8(value: ByteArray, size: Int): Int {
var crc8 = 0
for (i in 0 until size) {
crc8 = CRC_8_TABLE[(value[i].toInt() and 255) xor (crc8 and 255)].toInt() and 255
crc8 = CRC_8_TABLE[(value[i].toInt() and 255) xor (crc8 and 255)] and 255
}
return crc8
}

View file

@ -5,11 +5,11 @@ enum class AlarmState {
PUMP_LOW_BATTERY, // Mapped from error flag 1
PUMP_LOW_RESERVOIR, // Mapped from error flag 2
PUMP_EXPIRES_SOON, // Mapped from error flag 3
LOWBG_SUSPENDED, // Mapped from pump status 64
LOWBG_SUSPENDED2, // Mapped from pump status 65
LOW_BG_SUSPENDED, // Mapped from pump status 64
LOW_BG_SUSPENDED2, // Mapped from pump status 65
AUTO_SUSPENDED, // Mapped from pump status 66
HMAX_SUSPENDED, // Mapped from pump status 67
DMAX_SUSPENDED, // Mapped from pump status 68
HOURLY_MAX_SUSPENDED, // Mapped from pump status 67
DAILY_MAX_SUSPENDED, // Mapped from pump status 68
SUSPENDED, // Mapped from pump status 69
PAUSED, // Mapped from pump status 70
OCCLUSION, // Mapped from pump status 96

View file

@ -10,11 +10,11 @@ enum class MedtrumPumpState(val state: Byte) {
EJECTED(6),
ACTIVE(32),
ACTIVE_ALT(33),
LOWBG_SUSPENDED(64),
LOWBG_SUSPENDED2(65),
LOW_BG_SUSPENDED(64),
LOW_BG_SUSPENDED2(65),
AUTO_SUSPENDED(66),
HMAX_SUSPENDED(67),
DMAX_SUSPENDED(68),
HOURLY_MAX_SUSPENDED(67),
DAILY_MAX_SUSPENDED(68),
SUSPENDED(69),
PAUSED(70),
OCCLUSION(96),
@ -28,6 +28,7 @@ enum class MedtrumPumpState(val state: Byte) {
STOPPED(128.toByte());
companion object {
fun fromByte(state: Byte) = values().find { it.state == state }
?: throw IllegalAccessException("")
}

View file

@ -55,7 +55,7 @@ class ActivatePacket(injector: HasAndroidInjector, private val basalProfile: Byt
* byte 6: predictiveLowSuspend // Value for auto mode, not used for AAPS
* byte 7: predictiveLowSuspendRange // Value for auto mode, not used for AAPS
* byte 8-9: hourlyMaxInsulin // Max hourly dose of insulin, divided by 0.05
* byte 10-11: daylyMaxSet // Max daily dose of insulin, divided by 0.05
* byte 10-11: dailyMaxSet // Max daily dose of insulin, divided by 0.05
* byte 12-13: tddToday // Current TDD (of present day), divided by 0.05
* byte 14: 1 // Always 1
* bytes 15 - end // Basal profile > see MedtrumPump
@ -98,7 +98,7 @@ class ActivatePacket(injector: HasAndroidInjector, private val basalProfile: Byt
medtrumPump.currentSequenceNumber = basalSequence // We are activated, set the new seq nr
medtrumPump.syncedSequenceNumber = basalSequence // We are activated, reset the synced seq nr ()
// Sync canula change
// Sync cannula change
pumpSync.insertTherapyEventIfNewWithTimestamp(
timestamp = System.currentTimeMillis(),
type = DetailedBolusInfo.EventType.CANNULA_CHANGE,

View file

@ -7,7 +7,6 @@ import info.nightscout.pump.medtrum.comm.enums.BasalType
import info.nightscout.pump.medtrum.extension.toInt
import info.nightscout.pump.medtrum.extension.toLong
import info.nightscout.pump.medtrum.util.MedtrumTimeUtil
import info.nightscout.rx.logging.LTag
import info.nightscout.shared.utils.DateUtil
import javax.inject.Inject

View file

@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.pump.medtrum.comm.enums.CommandType.CLEAR_ALARM
import info.nightscout.pump.medtrum.extension.toByteArray
class ClearPumpAlarmPacket(injector: HasAndroidInjector, val clearType: Int) : MedtrumPacket(injector) {
class ClearPumpAlarmPacket(injector: HasAndroidInjector, private val clearType: Int) : MedtrumPacket(injector) {
init {
opCode = CLEAR_ALARM.code

View file

@ -15,7 +15,6 @@ import info.nightscout.pump.medtrum.extension.toLong
import info.nightscout.pump.medtrum.util.MedtrumTimeUtil
import info.nightscout.rx.logging.LTag
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T
import javax.inject.Inject
class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int) : MedtrumPacket(injector) {
@ -38,9 +37,9 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
private const val RESP_RECORD_UNKNOWN1_END = RESP_RECORD_UNKNOWN1_START + 1
private const val RESP_RECORD_SERIAL_START = RESP_RECORD_UNKNOWN1_END
private const val RESP_RECORD_SERIAL_END = RESP_RECORD_SERIAL_START + 4
private const val RESP_RECORD_PATCHID_START = RESP_RECORD_SERIAL_END
private const val RESP_RECORD_PATCHID_END = RESP_RECORD_PATCHID_START + 2
private const val RESP_RECORD_SEQUENCE_START = RESP_RECORD_PATCHID_END
private const val RESP_RECORD_PATCH_ID_START = RESP_RECORD_SERIAL_END
private const val RESP_RECORD_PATCH_ID_END = RESP_RECORD_PATCH_ID_START + 2
private const val RESP_RECORD_SEQUENCE_START = RESP_RECORD_PATCH_ID_END
private const val RESP_RECORD_SEQUENCE_END = RESP_RECORD_SEQUENCE_START + 2
private const val RESP_RECORD_DATA_START = RESP_RECORD_SEQUENCE_END
@ -75,7 +74,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
val recordUnknown = data.copyOfRange(RESP_RECORD_UNKNOWN_START, RESP_RECORD_UNKNOWN_END).toInt()
val recordType = data.copyOfRange(RESP_RECORD_TYPE_START, RESP_RECORD_TYPE_END).toInt()
val recordSerial = data.copyOfRange(RESP_RECORD_SERIAL_START, RESP_RECORD_SERIAL_END).toLong()
val recordPatchId = data.copyOfRange(RESP_RECORD_PATCHID_START, RESP_RECORD_PATCHID_END).toInt()
val recordPatchId = data.copyOfRange(RESP_RECORD_PATCH_ID_START, RESP_RECORD_PATCH_ID_END).toInt()
val recordSequence = data.copyOfRange(RESP_RECORD_SEQUENCE_START, RESP_RECORD_SEQUENCE_END).toInt()
aapsLogger.debug(
@ -101,13 +100,15 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
val bolusCarb = data.copyOfRange(RESP_RECORD_DATA_START + 18, RESP_RECORD_DATA_START + 20).toInt()
val bolusGlucose = data.copyOfRange(RESP_RECORD_DATA_START + 20, RESP_RECORD_DATA_START + 22).toInt()
val bolusIOB = data.copyOfRange(RESP_RECORD_DATA_START + 22, RESP_RECORD_DATA_START + 24).toInt()
val unkown1 = data.copyOfRange(RESP_RECORD_DATA_START + 24, RESP_RECORD_DATA_START + 26).toInt()
val unkown2 = data.copyOfRange(RESP_RECORD_DATA_START + 26, RESP_RECORD_DATA_START + 28).toInt()
val unknown1 = data.copyOfRange(RESP_RECORD_DATA_START + 24, RESP_RECORD_DATA_START + 26).toInt()
val unknown2 = data.copyOfRange(RESP_RECORD_DATA_START + 26, RESP_RECORD_DATA_START + 28).toInt()
val bolusType = enumValues<BolusType>()[typeAndWizard and 0x0F]
val bolusWizard = (typeAndWizard and 0xF0) != 0
aapsLogger.debug(
LTag.PUMPCOMM,
"GetRecordPacket HandleResponse: BOLUS_RECORD: typeAndWizard: $typeAndWizard, bolusCause: $bolusCause, unknown: $unknown, bolusStartTime: $bolusStartTime, " + "bolusNormalAmount: $bolusNormalAmount, bolusNormalDelivered: $bolusNormalDelivered, bolusExtendedAmount: $bolusExtendedAmount, bolusExtendedDuration: $bolusExtendedDuration, " + "bolusExtendedDelivered: $bolusExtendedDelivered, bolusCarb: $bolusCarb, bolusGlucose: $bolusGlucose, bolusIOB: $bolusIOB, unkown1: $unkown1, unkown2: $unkown2, " + "bolusType: $bolusType, bolusWizard: $bolusWizard"
"GetRecordPacket HandleResponse: BOLUS_RECORD: typeAndWizard: $typeAndWizard, bolusCause: $bolusCause, unknown: $unknown, bolusStartTime: $bolusStartTime, " +
"bolusNormalAmount: $bolusNormalAmount, bolusNormalDelivered: $bolusNormalDelivered, bolusExtendedAmount: $bolusExtendedAmount, bolusExtendedDuration: " +
"$bolusExtendedDuration, " + "bolusExtendedDelivered: $bolusExtendedDelivered, bolusCarb: $bolusCarb, bolusGlucose: $bolusGlucose, bolusIOB: $bolusIOB, unknown1: $unknown1, unknown2: $unknown2, " + "bolusType: $bolusType, bolusWizard: $bolusWizard"
)
if (bolusType == BolusType.NORMAL) {
@ -123,7 +124,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
pumpType = medtrumPump.pumpType(),
pumpSerial = medtrumPump.pumpSN.toString(radix = 16)
)
if (syncOk == false) {
if (!syncOk) {
aapsLogger.warn(LTag.PUMPCOMM, "GetRecordPacket HandleResponse: BOLUS_RECORD: Failed to sync bolus with tempId: ${detailedBolusInfo.timestamp}")
// detailedInfo can be from another similar record. Reinsert
detailedBolusInfoStorage.add(detailedBolusInfo)
@ -298,7 +299,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
aapsLogger.debug(LTag.PUMPCOMM, "GetRecordPacket HandleResponse: TDD_RECORD")
val timestamp = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(RESP_RECORD_DATA_START, RESP_RECORD_DATA_START + 4).toLong())
val timeZoneOffset = data.copyOfRange(RESP_RECORD_DATA_START + 4, RESP_RECORD_DATA_START + 6).toInt()
val tddMins = data.copyOfRange(RESP_RECORD_DATA_START + 6, RESP_RECORD_DATA_START + 8).toInt()
val tddMinutes = data.copyOfRange(RESP_RECORD_DATA_START + 6, RESP_RECORD_DATA_START + 8).toInt()
val glucoseRecordTime = data.copyOfRange(RESP_RECORD_DATA_START + 8, RESP_RECORD_DATA_START + 12).toLong()
val tdd = data.copyOfRange(RESP_RECORD_DATA_START + 12, RESP_RECORD_DATA_START + 16).toFloat()
val basalTdd = data.copyOfRange(RESP_RECORD_DATA_START + 16, RESP_RECORD_DATA_START + 20).toFloat()
@ -315,7 +316,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int
val newUMax = data.copyOfRange(RESP_RECORD_DATA_START + 60, RESP_RECORD_DATA_START + 64).toFloat()
aapsLogger.debug(
LTag.PUMPCOMM, "TDD_RECORD: timestamp: $timestamp, timeZoneOffset: $timeZoneOffset, tddMins: $tddMins, glucoseRecordTime: $glucoseRecordTime, tdd: " +
LTag.PUMPCOMM, "TDD_RECORD: timestamp: $timestamp, timeZoneOffset: $timeZoneOffset, tddMinutes: $tddMinutes, glucoseRecordTime: $glucoseRecordTime, tdd: " +
"$tdd, basalTdd: $basalTdd, glucose: $glucose, unknown: $unknown, meanSomething: $meanSomething, usedTdd: $usedTdd, usedIBasal: $usedIBasal, usedSgBasal: " +
"$usedSgBasal, usedUMax: $usedUMax, newTdd: $newTdd, newIBasal: $newIBasal, newSgBasal: $newSgBasal, newUMax: $newUMax"
)

View file

@ -25,7 +25,7 @@ open class MedtrumPacket(protected var injector: HasAndroidInjector) {
}
init {
// @Suppress("LeakingThis")
@Suppress("LeakingThis")
injector.androidInjector().inject(this)
}
@ -33,7 +33,7 @@ open class MedtrumPacket(protected var injector: HasAndroidInjector) {
return byteArrayOf(opCode)
}
/** handles a response from the Medtrum pump, returns true if command was successfull, returns false if command failed or waiting for response */
/** handles a response from the Medtrum pump, returns true if command was successful, returns false if command failed or waiting for response */
open fun handleResponse(data: ByteArray): Boolean {
// Check for broken packets
if (RESP_RESULT_END > data.size) {

View file

@ -19,7 +19,7 @@ class NotificationPacket(val injector: HasAndroidInjector) {
* but a notification packet. It is sent by the pump to the phone
* when the pump has a notification to send.
*
* Notifications are sent regualary, regardless of the pump state.
* Notifications are sent regularly, regardless of the pump state.
*
* There can be multiple messages in one packet, this is noted by the fieldMask.
*
@ -97,10 +97,10 @@ class NotificationPacket(val injector: HasAndroidInjector) {
if (fieldMask and MASK_NORMAL_BOLUS != 0) {
aapsLogger.debug(LTag.PUMPCOMM, "Normal bolus notification received")
var bolusData = data.copyOfRange(offset, offset + 1).toInt()
var bolusType = bolusData and 0x7F
val bolusData = data.copyOfRange(offset, offset + 1).toInt()
val bolusType = bolusData and 0x7F
val bolusCompleted: Boolean = ((bolusData shr 7) and 0x01) != 0
var bolusDelivered = data.copyOfRange(offset + 1, offset + 3).toInt() * 0.05
val bolusDelivered = data.copyOfRange(offset + 1, offset + 3).toInt() * 0.05
aapsLogger.debug(LTag.PUMPCOMM, "Bolus type: $bolusType, bolusData: $bolusData bolus completed: $bolusCompleted, bolus delivered: $bolusDelivered")
medtrumPump.handleBolusStatusUpdate(bolusType, bolusCompleted, bolusDelivered)
offset += 3
@ -115,12 +115,12 @@ class NotificationPacket(val injector: HasAndroidInjector) {
if (fieldMask and MASK_BASAL != 0) {
aapsLogger.debug(LTag.PUMPCOMM, "Basal notification received")
val basalType = enumValues<BasalType>()[data.copyOfRange(offset, offset + 1).toInt()]
var basalSequence = data.copyOfRange(offset + 1, offset + 3).toInt()
var basalPatchId = data.copyOfRange(offset + 3, offset + 5).toLong()
var basalStartTime = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(offset + 5, offset + 9).toLong())
var basalRateAndDelivery = data.copyOfRange(offset + 9, offset + 12).toInt()
var basalRate = (basalRateAndDelivery and 0xFFF) * 0.05
var basalDelivery = (basalRateAndDelivery shr 12) * 0.05
val basalSequence = data.copyOfRange(offset + 1, offset + 3).toInt()
val basalPatchId = data.copyOfRange(offset + 3, offset + 5).toLong()
val basalStartTime = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(offset + 5, offset + 9).toLong())
val basalRateAndDelivery = data.copyOfRange(offset + 9, offset + 12).toInt()
val basalRate = (basalRateAndDelivery and 0xFFF) * 0.05
val basalDelivery = (basalRateAndDelivery shr 12) * 0.05
aapsLogger.debug(
LTag.PUMPCOMM,
"Basal type: $basalType, basal sequence: $basalSequence, basal patch id: $basalPatchId, basal time: $basalStartTime, basal rate: $basalRate, basal delivery: $basalDelivery"
@ -159,7 +159,7 @@ class NotificationPacket(val injector: HasAndroidInjector) {
if (fieldMask and MASK_BATTERY != 0) {
aapsLogger.debug(LTag.PUMPCOMM, "Battery notification received")
var parameter = data.copyOfRange(offset, offset + 3).toInt()
val parameter = data.copyOfRange(offset, offset + 3).toInt()
// Precision for voltage A is a guess, voltage B is the important one, threshold: < 2.64
medtrumPump.batteryVoltage_A = (parameter and 0xFFF) / 512.0
medtrumPump.batteryVoltage_B = (parameter shr 12) / 512.0

View file

@ -2,7 +2,6 @@ package info.nightscout.pump.medtrum.comm.packets
import dagger.android.HasAndroidInjector
import info.nightscout.pump.medtrum.comm.enums.CommandType.RESUME_PUMP
import info.nightscout.pump.medtrum.extension.toByteArray
class ResumePumpPacket(injector: HasAndroidInjector) : MedtrumPacket(injector) {

View file

@ -13,7 +13,7 @@ class SetTimeZonePacket(injector: HasAndroidInjector) : MedtrumPacket(injector)
@Inject lateinit var dateUtil: DateUtil
@Inject lateinit var medtrumPump: MedtrumPump
var offsetMins: Int = 0
private var offsetMinutes: Int = 0
init {
opCode = SET_TIME_ZONE.code
@ -21,15 +21,15 @@ class SetTimeZonePacket(injector: HasAndroidInjector) : MedtrumPacket(injector)
override fun getRequest(): ByteArray {
val time = MedtrumTimeUtil().getCurrentTimePumpSeconds()
offsetMins = dateUtil.getTimeZoneOffsetMinutes(dateUtil.now())
if (offsetMins < 0) offsetMins += 65536
return byteArrayOf(opCode) + offsetMins.toByteArray(2) + time.toByteArray(4)
offsetMinutes = dateUtil.getTimeZoneOffsetMinutes(dateUtil.now())
if (offsetMinutes < 0) offsetMinutes += 65536
return byteArrayOf(opCode) + offsetMinutes.toByteArray(2) + time.toByteArray(4)
}
override fun handleResponse(data: ByteArray): Boolean {
val success = super.handleResponse(data)
if (success) {
medtrumPump.pumpTimeZoneOffset = offsetMins
medtrumPump.pumpTimeZoneOffset = offsetMinutes
}
return success
}

View file

@ -16,7 +16,6 @@ class SynchronizePacket(injector: HasAndroidInjector) : MedtrumPacket(injector)
companion object {
private const val RESP_STATE_START = 6
private const val RESP_STATE_END = RESP_STATE_START + 1
private const val RESP_FIELDS_START = 7
private const val RESP_FIELDS_END = RESP_FIELDS_START + 2
private const val RESP_SYNC_DATA_START = 9
@ -34,7 +33,7 @@ class SynchronizePacket(injector: HasAndroidInjector) : MedtrumPacket(injector)
override fun handleResponse(data: ByteArray): Boolean {
val success = super.handleResponse(data)
if (success) {
var state = MedtrumPumpState.fromByte(data[RESP_STATE_START])
val state = MedtrumPumpState.fromByte(data[RESP_STATE_START])
aapsLogger.debug(LTag.PUMPCOMM, "SynchronizePacket: state: $state")
if (state != medtrumPump.pumpState) {

View file

@ -8,7 +8,7 @@ class Crypt {
private val RIJNDEAL_S_BOX: IntArray = intArrayOf(99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22)
private val RIJNDEAL_INVERSE_S_BOX: IntArray = intArrayOf(82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125)
val MED_CIPHER: Long = 1344751489
private val MED_CIPHER: Long = 1344751489
fun keyGen(input: Long): Long {
val key = randomGen(randomGen(MED_CIPHER xor input))
@ -25,7 +25,7 @@ class Crypt {
private fun simpleCrypt(inputData: Long): Long {
var temp = inputData xor MED_CIPHER
for (i in 0 until 32) {
temp = changeByTable(rotatoLeft(temp, 32, 1), RIJNDEAL_S_BOX).toLong()
temp = changeByTable(rotatoLeft(temp, 32, 1), RIJNDEAL_S_BOX)
}
return temp
}

View file

@ -21,7 +21,7 @@ fun ByteArray.toInt(): Int {
var result = 0
for (i in this.indices) {
val byte = this[i]
val shifted = (byte.toInt() and 0xFF).toInt() shl 8 * i
val shifted = (byte.toInt() and 0xFF) shl 8 * i
result = result or shifted
}
return result

View file

@ -9,26 +9,3 @@ fun View?.visible(vararg views: View?) {
for (view in views)
view.visible()
}
fun View?.invisible() = this?.run { visibility = View.INVISIBLE }
fun View?.invisible(vararg views: View?) {
invisible()
for (view in views)
view.invisible()
}
fun View?.gone() = this?.run { visibility = View.GONE }
fun View?.gone(vararg views: View?) {
gone()
for (view in views)
view.gone()
}
fun View?.setVisibleOrGone(visibleOrGone: Boolean, vararg views: View?) {
for (view in views)
if (visibleOrGone) view.visible() else view.gone()
}
fun View?.setVisibleOrGone(visibleOrGone: Boolean) = setVisibleOrGone(visibleOrGone, this)

View file

@ -241,16 +241,16 @@ class BLEComm @Inject internal constructor(
}
override fun onCharacteristicRead(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, status: Int) {
aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicRead data: " + characteristic.value.contentToString() + " UUID: " + characteristic.getUuid().toString() + " status: " + status)
aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicRead data: " + characteristic.value.contentToString() + " UUID: " + characteristic.uuid.toString() + " status: " + status)
}
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicChanged data: " + characteristic.value.contentToString() + " UUID: " + characteristic.getUuid().toString())
aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicChanged data: " + characteristic.value.contentToString() + " UUID: " + characteristic.uuid.toString())
val value = characteristic.getValue()
if (characteristic.getUuid() == UUID.fromString(READ_UUID)) {
val value = characteristic.value
if (characteristic.uuid == UUID.fromString(READ_UUID)) {
mCallback?.onNotification(value)
} else if (characteristic.getUuid() == UUID.fromString(WRITE_UUID)) {
} else if (characteristic.uuid == UUID.fromString(WRITE_UUID)) {
synchronized(readLock) {
if (mReadPacket == null) {
mReadPacket = ReadDataPacket(value)
@ -398,7 +398,7 @@ class BLEComm @Inject internal constructor(
@Synchronized
fun sendMessage(message: ByteArray) {
aapsLogger.debug(LTag.PUMPBTCOMM, "sendMessage message = " + Arrays.toString(message))
aapsLogger.debug(LTag.PUMPBTCOMM, "sendMessage message = " + message.contentToString())
if (mWritePackets?.allPacketsConsumed() == false) {
aapsLogger.error(LTag.PUMPBTCOMM, "sendMessage not all packets consumed!! unable to sent message!")
return
@ -455,7 +455,7 @@ class BLEComm @Inject internal constructor(
val gattService = getGattService() ?: return
var uuid: String
val gattCharacteristics = gattService.characteristics
for (i in 0..gattCharacteristics.size - 1) {
for (i in 0 until gattCharacteristics.size) {
val gattCharacteristic = gattCharacteristics.get(i)
// Check whether read or write properties is set, the pump needs us to enable notifications on all characteristics that have these properties
if (gattCharacteristic.properties and NEEDS_ENABLE > 0) {

View file

@ -29,7 +29,6 @@ import info.nightscout.pump.medtrum.code.ConnectionState
import info.nightscout.pump.medtrum.comm.enums.AlarmState
import info.nightscout.pump.medtrum.comm.enums.MedtrumPumpState
import info.nightscout.pump.medtrum.comm.packets.*
import info.nightscout.pump.medtrum.util.MedtrumTimeUtil
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventAppExit
@ -84,8 +83,6 @@ class MedtrumService : DaggerService(), BLECommCallback {
private const val ALARM_DAILY_MAX_CLEAR_CODE = 5
}
val timeUtil = MedtrumTimeUtil()
private val disposable = CompositeDisposable()
private val mBinder: IBinder = LocalBinder()
@ -124,7 +121,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
medtrumPump.loadUserSettingsFromSP()
commandQueue.setUserOptions(object : Callback() {
override fun run() {
if (medtrumPlugin.isInitialized() && this.result.success == false) {
if (medtrumPlugin.isInitialized() && !this.result.success) {
uiInteraction.addNotification(
Notification.PUMP_SETTINGS_FAILED,
rh.gs(R.string.pump_setting_failed),
@ -204,7 +201,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
}
fun readPumpStatus() {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingpumpstatus)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_pump_status)))
updateTimeIfNeeded(false)
loadEvents()
}
@ -229,7 +226,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
fun updateTimeIfNeeded(needLoadHistory: Boolean = true): Boolean {
// Note we only check timeZone here, time is updated each connection attempt if needed, because the pump requires it to be checked
// But we dont check timeZone each time, therefore we do it here (if needed)
// But we don't check timeZone each time, therefore we do it here (if needed)
var result = true
if (medtrumPump.pumpTimeZoneOffset != dateUtil.getTimeZoneOffsetMinutes(dateUtil.now())) {
result = sendPacketAndGetResponse(SetTimePacket(injector))
@ -245,7 +242,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
}
fun loadEvents(): Boolean {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingpumpstatus)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_pump_status)))
// Sync records
val result = syncRecords()
if (result) {
@ -261,16 +258,16 @@ class MedtrumService : DaggerService(), BLECommCallback {
var result = true
if (medtrumPump.pumpState in listOf(
MedtrumPumpState.PAUSED,
MedtrumPumpState.HMAX_SUSPENDED,
MedtrumPumpState.DMAX_SUSPENDED
MedtrumPumpState.HOURLY_MAX_SUSPENDED,
MedtrumPumpState.DAILY_MAX_SUSPENDED
)
) {
when (medtrumPump.pumpState) {
MedtrumPumpState.HMAX_SUSPENDED -> {
MedtrumPumpState.HOURLY_MAX_SUSPENDED -> {
result = sendPacketAndGetResponse(ClearPumpAlarmPacket(injector, ALARM_HOURLY_MAX_CLEAR_CODE))
}
MedtrumPumpState.DMAX_SUSPENDED -> {
MedtrumPumpState.DAILY_MAX_SUSPENDED -> {
result = sendPacketAndGetResponse(ClearPumpAlarmPacket(injector, ALARM_DAILY_MAX_CLEAR_CODE))
}
@ -285,7 +282,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
}
fun setUserSettings(): Boolean {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.settingpumpsettings)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.setting_pump_settings)))
return sendPacketAndGetResponse(SetPatchPacket(injector))
}
@ -301,16 +298,16 @@ class MedtrumService : DaggerService(), BLECommCallback {
medtrumPump.bolusStopped = false
medtrumPump.bolusProgressLastTimeStamp = bolusStart
if (insulin > 0 && !medtrumPump.bolusStopped) {
if (insulin > 0) {
val result = sendPacketAndGetResponse(SetBolusPacket(injector, insulin))
if (result == false) {
if (!result) {
aapsLogger.error(LTag.PUMPCOMM, "Failed to set bolus")
commandQueue.loadEvents(null) // make sure if anything is delivered (which is highly unlikely at this point) we get it
t.insulin = 0.0
return false
}
} else {
aapsLogger.debug(LTag.PUMPCOMM, "Bolus not set, insulin: $insulin, bolusStopped: ${medtrumPump.bolusStopped}")
aapsLogger.debug(LTag.PUMPCOMM, "Bolus not set, insulin: $insulin")
t.insulin = 0.0
return false
}
@ -384,7 +381,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
// Do not call update status directly, reconnection may be needed
commandQueue.loadEvents(object : Callback() {
override fun run() {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingbolusstatus)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_bolus_status)))
bolusingEvent.percent = 100
}
})
@ -395,7 +392,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
aapsLogger.debug(LTag.PUMPCOMM, "bolusStop >>>>> @ " + if (medtrumPump.bolusingTreatment == null) "" else medtrumPump.bolusingTreatment?.insulin)
if (isConnected) {
var success = sendPacketAndGetResponse(CancelBolusPacket(injector))
var timeout = System.currentTimeMillis() + T.secs(30).msecs()
val timeout = System.currentTimeMillis() + T.secs(30).msecs()
while (!success && System.currentTimeMillis() < timeout) {
success = sendPacketAndGetResponse(CancelBolusPacket(injector))
SystemClock.sleep(200)
@ -414,11 +411,11 @@ class MedtrumService : DaggerService(), BLECommCallback {
}
if (result) result = sendPacketAndGetResponse(SetTempBasalPacket(injector, absoluteRate, durationInMinutes))
// Get history records, this will update the prevoius basals
// Get history records, this will update the previous basals
// Do not call update status directly, reconnection may be needed
commandQueue.loadEvents(object : Callback() {
override fun run() {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingtempbasalstatus)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_temp_basal_status)))
}
})
@ -426,13 +423,13 @@ class MedtrumService : DaggerService(), BLECommCallback {
}
fun cancelTempBasal(): Boolean {
var result = sendPacketAndGetResponse(CancelTempBasalPacket(injector))
val result = sendPacketAndGetResponse(CancelTempBasalPacket(injector))
// Get history records, this will update the prevoius basals
// Get history records, this will update the previous basals
// Do not call update status directly, reconnection may be needed
commandQueue.loadEvents(object : Callback() {
override fun run() {
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingtempbasalstatus)))
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_temp_basal_status)))
}
})
@ -462,7 +459,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
if (medtrumPump.syncedSequenceNumber < medtrumPump.currentSequenceNumber) {
for (sequence in (medtrumPump.syncedSequenceNumber + 1)..medtrumPump.currentSequenceNumber) {
result = sendPacketAndGetResponse(GetRecordPacket(injector, sequence), COMMAND_SYNC_TIMEOUT_SEC)
if (result == false) break
if (!result) break
}
}
return result
@ -472,11 +469,11 @@ class MedtrumService : DaggerService(), BLECommCallback {
// Map the pump state to an alarm state and add it to the active alarms
val alarmState = when (state) {
MedtrumPumpState.NONE -> AlarmState.NONE
MedtrumPumpState.LOWBG_SUSPENDED -> AlarmState.LOWBG_SUSPENDED
MedtrumPumpState.LOWBG_SUSPENDED2 -> AlarmState.LOWBG_SUSPENDED2
MedtrumPumpState.LOW_BG_SUSPENDED -> AlarmState.LOW_BG_SUSPENDED
MedtrumPumpState.LOW_BG_SUSPENDED2 -> AlarmState.LOW_BG_SUSPENDED2
MedtrumPumpState.AUTO_SUSPENDED -> AlarmState.AUTO_SUSPENDED
MedtrumPumpState.HMAX_SUSPENDED -> AlarmState.HMAX_SUSPENDED
MedtrumPumpState.DMAX_SUSPENDED -> AlarmState.DMAX_SUSPENDED
MedtrumPumpState.HOURLY_MAX_SUSPENDED -> AlarmState.HOURLY_MAX_SUSPENDED
MedtrumPumpState.DAILY_MAX_SUSPENDED -> AlarmState.DAILY_MAX_SUSPENDED
MedtrumPumpState.SUSPENDED -> AlarmState.SUSPENDED
MedtrumPumpState.PAUSED -> AlarmState.PAUSED
MedtrumPumpState.OCCLUSION -> AlarmState.OCCLUSION
@ -533,8 +530,8 @@ class MedtrumService : DaggerService(), BLECommCallback {
medtrumPump.clearAlarmState()
}
MedtrumPumpState.LOWBG_SUSPENDED,
MedtrumPumpState.LOWBG_SUSPENDED2,
MedtrumPumpState.LOW_BG_SUSPENDED,
MedtrumPumpState.LOW_BG_SUSPENDED2,
MedtrumPumpState.AUTO_SUSPENDED,
MedtrumPumpState.SUSPENDED,
MedtrumPumpState.PAUSED -> {
@ -546,7 +543,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
// Pump will report proper TBR for this
}
MedtrumPumpState.HMAX_SUSPENDED -> {
MedtrumPumpState.HOURLY_MAX_SUSPENDED -> {
uiInteraction.addNotification(
Notification.PUMP_SUSPENDED,
rh.gs(R.string.pump_is_suspended_hour_max),
@ -555,7 +552,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
// Pump will report proper TBR for this
}
MedtrumPumpState.DMAX_SUSPENDED -> {
MedtrumPumpState.DAILY_MAX_SUSPENDED -> {
uiInteraction.addNotification(
Notification.PUMP_SUSPENDED,
rh.gs(R.string.pump_is_suspended_day_max),
@ -721,8 +718,6 @@ class MedtrumService : DaggerService(), BLECommCallback {
// State for connect flow
private inner class AuthState : State() {
val retryCounter = 0
override fun onEnter() {
aapsLogger.debug(LTag.PUMPCOMM, "Medtrum Service reached AuthState")
mPacket = AuthorizePacket(injector)
@ -734,7 +729,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
// Check if we have a supported pump
@ -776,7 +771,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
// Place holder, not really used (yet)
@ -808,7 +803,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
val currTime = dateUtil.now()
@ -843,7 +838,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
toState(SetTimeZoneState())
@ -871,7 +866,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
medtrumPump.needCheckTimeUpdate = false
@ -901,7 +896,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
toState(SubscribeState())
@ -929,7 +924,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
toState(ReadyState())
@ -949,7 +944,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onEnter() {
aapsLogger.debug(LTag.PUMPCOMM, "Medtrum Service reached ReadyState!")
// Now we are fully connected and authenticated and we can start sending commands. Let AAPS know
if (isConnected == false) {
if (!isConnected) {
medtrumPump.connectionState = ConnectionState.CONNECTED
}
}
@ -964,7 +959,7 @@ class MedtrumService : DaggerService(), BLECommCallback {
override fun onIndication(data: ByteArray) {
if (mPacket?.handleResponse(data) == true) {
// Succes!
// Success!
responseHandled = true
responseSuccess = true
toState(ReadyState())

View file

@ -6,6 +6,7 @@ import android.content.pm.ActivityInfo
import android.os.Bundle
import android.view.MotionEvent
import android.view.WindowManager
import androidx.activity.OnBackPressedCallback
import androidx.lifecycle.ViewModelProvider
import info.nightscout.core.utils.extensions.safeGetSerializableExtra
import info.nightscout.pump.medtrum.R
@ -19,17 +20,13 @@ class MedtrumActivity : MedtrumBaseActivity<ActivityMedtrumBinding>() {
override fun getLayoutId(): Int = R.layout.activity_medtrum
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
return super.dispatchTouchEvent(event)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
binding.apply {
viewModel = ViewModelProvider(this@MedtrumActivity, viewModelFactory).get(MedtrumViewModel::class.java)
viewModel = ViewModelProvider(this@MedtrumActivity, viewModelFactory)[MedtrumViewModel::class.java]
viewModel?.apply {
processIntent(intent)
@ -70,6 +67,28 @@ class MedtrumActivity : MedtrumBaseActivity<ActivityMedtrumBinding>() {
}
}
}
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
binding.viewModel?.apply {
when (patchStep.value) {
PatchStep.PREPARE_PATCH,
PatchStep.START_DEACTIVATION,
PatchStep.RETRY_ACTIVATION -> {
handleCancel()
this@MedtrumActivity.finish()
}
PatchStep.COMPLETE,
PatchStep.DEACTIVATION_COMPLETE -> {
handleComplete()
this@MedtrumActivity.finish()
}
else -> Unit
}
}
}
})
}
override fun onNewIntent(intent: Intent?) {
@ -88,20 +107,10 @@ class MedtrumActivity : MedtrumBaseActivity<ActivityMedtrumBinding>() {
}
}
override fun onDestroy() {
super.onDestroy()
}
override fun onBackPressed() {
binding.viewModel?.apply {
// Do nothing
}
}
companion object {
const val EXTRA_START_PATCH_STEP = "EXTRA_START_PATCH_FRAGMENT_UI"
const val EXTRA_START_FROM_MENU = "EXTRA_START_FROM_MENU"
private const val EXTRA_START_FROM_MENU = "EXTRA_START_FROM_MENU"
@JvmStatic fun createIntentFromMenu(context: Context, patchStep: PatchStep): Intent {
return Intent(context, MedtrumActivity::class.java).apply {
@ -115,5 +124,4 @@ class MedtrumActivity : MedtrumBaseActivity<ActivityMedtrumBinding>() {
private fun setupViewFragment(baseFragment: MedtrumBaseFragment<*>) {
replaceFragmentInActivity(baseFragment, R.id.framelayout_fragment, false)
}
}

View file

@ -5,7 +5,6 @@ import android.view.View
import androidx.lifecycle.ViewModelProvider
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPreparePatchBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimeCompleteBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimeBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimingBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -7,7 +7,6 @@ import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumRetryActivationConnectBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -7,7 +7,6 @@ import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumRetryActivationBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
@ -32,7 +31,7 @@ class MedtrumRetryActivationFragment : MedtrumBaseFragment<FragmentMedtrumRetryA
binding.apply {
viewModel = ViewModelProvider(requireActivity(), viewModelFactory)[MedtrumViewModel::class.java]
viewModel?.apply {
preparePatch() // Use this to make sure we are disconnceted at this stage
preparePatch() // Use this to make sure we are disconnected at this stage
}
btnNegative.setOnClickListener {
OKDialog.showConfirmation(requireActivity(), rh.gs(R.string.medtrum_deactivate_pump_confirm)) {

View file

@ -7,7 +7,6 @@ import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.databinding.FragmentMedtrumStartDeactivationBinding
import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment
import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -9,7 +9,7 @@ import java.lang.ref.WeakReference
abstract class BaseViewModel<N : MedtrumBaseNavigator> : ViewModel() {
private var _navigator: WeakReference<N?>? = null
var navigator: N?
private var navigator: N?
set(value) {
_navigator = WeakReference(value)
}

View file

@ -114,7 +114,7 @@ class MedtrumOverviewViewModel @Inject constructor(
aapsLogger.debug(LTag.PUMP, "MedtrumViewModel pumpStateFlow: $state")
_canDoResetAlarms.postValue(
medtrumPump.pumpState in listOf(
MedtrumPumpState.PAUSED, MedtrumPumpState.HMAX_SUSPENDED, MedtrumPumpState.DMAX_SUSPENDED
MedtrumPumpState.PAUSED, MedtrumPumpState.HOURLY_MAX_SUSPENDED, MedtrumPumpState.DAILY_MAX_SUSPENDED
)
)
@ -153,7 +153,7 @@ class MedtrumOverviewViewModel @Inject constructor(
}
}
fun updateGUI() {
private fun updateGUI() {
// Update less dynamic values
if (medtrumPump.lastConnection != 0L) {
val agoMilliseconds = System.currentTimeMillis() - medtrumPump.lastConnection

View file

@ -10,13 +10,10 @@ import info.nightscout.pump.medtrum.MedtrumPump
import info.nightscout.pump.medtrum.R
import info.nightscout.pump.medtrum.code.ConnectionState
import info.nightscout.pump.medtrum.services.MedtrumService
import info.nightscout.pump.medtrum.code.EventType
import info.nightscout.pump.medtrum.code.PatchStep
import info.nightscout.pump.medtrum.comm.enums.MedtrumPumpState
import info.nightscout.pump.medtrum.encryption.Crypt
import info.nightscout.pump.medtrum.ui.MedtrumBaseNavigator
import info.nightscout.pump.medtrum.ui.event.SingleLiveEvent
import info.nightscout.pump.medtrum.ui.event.UIEvent
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
import kotlinx.coroutines.CoroutineScope
@ -43,10 +40,6 @@ class MedtrumViewModel @Inject constructor(
val title: LiveData<Int>
get() = _title
private val _eventHandler = SingleLiveEvent<UIEvent<EventType>>()
val eventHandler: LiveData<UIEvent<EventType>>
get() = _eventHandler
private var oldPatchStep: PatchStep? = null
private var mInitPatchStep: PatchStep? = null
private var connectRetryCounter = 0
@ -155,7 +148,7 @@ class MedtrumViewModel @Inject constructor(
PatchStep.RETRY_ACTIVATION_CONNECT,
PatchStep.PREPARE_PATCH_CONNECT -> {
// Make sure we are disconnected, else dont move step
// Make sure we are disconnected, else don't move step
if (medtrumService?.isConnected == true) {
aapsLogger.info(LTag.PUMP, "moveStep: connected, not moving step")
return
@ -167,7 +160,7 @@ class MedtrumViewModel @Inject constructor(
PatchStep.PRIME_COMPLETE,
PatchStep.ATTACH_PATCH,
PatchStep.ACTIVATE -> {
// Make sure we are connected, else dont move step
// Make sure we are connected, else don't move step
if (medtrumService?.isConnected == false) {
aapsLogger.info(LTag.PUMP, "moveStep: not connected, not moving step")
return
@ -321,7 +314,7 @@ class MedtrumViewModel @Inject constructor(
aapsLogger.info(LTag.PUMP, "prepareStep: title before cond: $stringResId")
if (currentTitle != stringResId) {
aapsLogger.info(LTag.PUMP, "prepareStep: title: $stringResId")
_title.postValue(stringResId)
stringResId?.let { _title.postValue(it) }
}
patchStep.postValue(newStep)

View file

@ -11,12 +11,6 @@ class MedtrumTimeUtil {
return Duration.between(startInstant, currentInstant).seconds
}
fun getCurrentTimePumpMillis() : Long {
val startInstant = Instant.parse("2014-01-01T00:00:00Z")
val currentInstant = Instant.now()
return Duration.between(startInstant, currentInstant).seconds * 1000
}
fun convertPumpTimeToSystemTimeMillis(pumpTime: Long): Long {
val startInstant = Instant.parse("2014-01-01T00:00:00Z")
val pumpInstant = startInstant.plusSeconds(pumpTime)

View file

@ -34,8 +34,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/string_change_patch" />
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -26,19 +26,33 @@
tools:context=".ui.MedtrumActivity">
<TextView
android:id="@+id/text_remove_base_discard_patch"
android:id="@+id/text_retract_needle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="5dp"
android:gravity="center"
android:text="@string/remove_base_discard_patch"
android:text="@string/retract_needle"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_remove_base_discard_patch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:gravity="center"
android:text="@string/remove_base_discard_patch"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_retract_needle" />
<TextView
android:id="@+id/text_press_next_or_OK"
android:layout_width="0dp"

View file

@ -1,6 +1,5 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- MedtrumPump -->
<!-- overview fragment -->
<!-- Alarm strings -->
<!-- wizard-->
<!-- settings-->
<!-- treatment state-->
</resources>

Some files were not shown because too many files have changed in this diff Show more