~aleteoryx/muditaos

ref: 1e604614bf9a25db0ddece0030a97bd35818468c muditaos/module-services/service-cellular/connection-manager/ConnectionManager.cpp -rw-r--r-- 3.1 KiB
1e604614 — Przemyslaw Brudny [EGD-7919] Sim input popup interactions on back fix 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <module-services/service-cellular/service-cellular/connection-manager/ConnectionManager.hpp>
#include <module-services/service-cellular/service-cellular/CellularMessage.hpp>
#include <module-cellular/at/Cmd.hpp>

auto ConnectionManager::onPhoneModeChange(sys::phone_modes::PhoneMode mode) -> bool
{
    if (mode == sys::phone_modes::PhoneMode::Offline) {
        forceDismissCallsFlag = true;
        return handleModeChangeToCommonOffline();
    }
    forceDismissCallsFlag = false;
    return handleModeChangeToConnected();
}

void ConnectionManager::onTimerTick()
{
    if (connectionInterval.count() == 0 || isFlightMode) {
        return;
    }

    minutesOfflineElapsed++;
    if (minutesOfflineElapsed.count() >= connectionInterval.count()) {
        minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
        ;
        onlinePeriod = true;
        cellular->connectToNetwork();
        return;
    }
    if (onlinePeriod) {
        minutesOnlineElapsed++;
        if (minutesOnlineElapsed.count() >= connectedPeriod.count()) {
            minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
            onlinePeriod         = false;
            cellular->disconnectFromNetwork();
        }
    }
}

void ConnectionManager::setInterval(const std::chrono::minutes interval)
{
    connectionInterval   = interval;
    minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
    ;
    minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
    ;
}

void ConnectionManager::setFlightMode(const bool mode)
{
    isFlightMode = mode;
}

auto ConnectionManager::isMessagesOnlyMode() -> bool
{
    return !isFlightMode && connectionInterval.count() != 0;
}

auto ConnectionManager::handleModeChangeToCommonOffline() -> bool
{
    if (cellular->isConnectedToNetwork()) {
        cellular->hangUpOngoingCall();
        cellular->disconnectFromNetwork();
        cellular->clearNetworkIndicator();
    }

    minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
    ;
    minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
    ;

    if (isMessagesOnlyMode()) {
        handleModeChangeToMessageOnlyMode();
        return true;
    }
    else {
        handleModeChangeToOfflineMode();
        return true;
    }
}

void ConnectionManager::handleModeChangeToOfflineMode()
{
    if (cellular->isConnectionTimerActive()) {
        cellular->stopConnectionTimer();
        onlinePeriod = false;
    }
}

void ConnectionManager::handleModeChangeToMessageOnlyMode()
{
    if (!cellular->isConnectionTimerActive()) {
        cellular->startConnectionTimer();
    }
}

auto ConnectionManager::handleModeChangeToConnected() -> bool
{
    if (cellular->isConnectionTimerActive()) {
        cellular->stopConnectionTimer();
        onlinePeriod = false;
    }
    if (!cellular->isConnectedToNetwork()) {
        cellular->connectToNetwork();
    }
    return true;
}

auto ConnectionManager::forceDismissCalls() -> bool
{
    return forceDismissCallsFlag;
}