chromium/ui/base/idle/idle_ios.mm

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/base/idle/idle.h"

#import <UIKit/UIKit.h>

#include "base/notreached.h"
#include "ui/base/idle/idle_internal.h"

@interface IOSScreenMonitor : NSObject

@property(readonly, nonatomic, getter=isAppInBackground) BOOL appInBackground;
@property(readonly, nonatomic, getter=isDeviceLocked) BOOL deviceLocked;

@end

@implementation IOSScreenMonitor

@synthesize appInBackground = _appInBackground;
@synthesize deviceLocked = _deviceLocked;

- (instancetype)init {
  if ((self = [super init])) {
    NSNotificationCenter* defaultCenter = NSNotificationCenter.defaultCenter;
    [defaultCenter addObserver:self
                      selector:@selector(onAppDidEnterBackground:)
                          name:UIApplicationDidEnterBackgroundNotification
                        object:nil];
    [defaultCenter addObserver:self
                      selector:@selector(onAppWillEnterForeground:)
                          name:UIApplicationWillEnterForegroundNotification
                        object:nil];
    [defaultCenter addObserver:self
                      selector:@selector(onDeviceLocked:)
                          name:UIApplicationProtectedDataWillBecomeUnavailable
                        object:nil];
    [defaultCenter addObserver:self
                      selector:@selector(onDeviceUnlocked:)
                          name:UIApplicationProtectedDataDidBecomeAvailable
                        object:nil];
  }
  return self;
}

- (void)dealloc {
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)onAppDidEnterBackground:(NSNotification*)notification {
  _appInBackground = YES;
}

- (void)onAppWillEnterForeground:(NSNotification*)notification {
  _appInBackground = NO;
}

- (void)onDeviceLocked:(NSNotification*)notification {
  _deviceLocked = YES;
}

- (void)onDeviceUnlocked:(NSNotification*)notification {
  _deviceLocked = NO;
}

@end

namespace ui {
namespace {

static IOSScreenMonitor* g_screenMonitor = nil;

}  // namespace

void InitIdleMonitor() {
  if (!g_screenMonitor) {
    g_screenMonitor = [[IOSScreenMonitor alloc] init];
  }
}

int CalculateIdleTime() {
  // TODO(crbug.com/40255110): Implement this.
  NOTIMPLEMENTED();
  return 0;
}

bool CheckIdleStateIsLocked() {
  if (IdleStateForTesting().has_value()) {
    return IdleStateForTesting().value() == IDLE_STATE_LOCKED;
  }

  return g_screenMonitor.appInBackground || g_screenMonitor.deviceLocked;
}

}  // namespace ui