Skip to content

Feat/#5 ban app list#6

Merged
sonms merged 17 commits into
developfrom
feat/#5-ban-app-list
May 20, 2026
Merged

Feat/#5 ban app list#6
sonms merged 17 commits into
developfrom
feat/#5-ban-app-list

Conversation

@sonms

@sonms sonms commented May 19, 2026

Copy link
Copy Markdown
Member

ISSUE

❗ WORK DESCRIPTION

금지앱 목업설정

Permission
실제 권한 체크 로직: PermissionChecker
외부 노출 행위: PermissionManager
실제 구현체: PermissionManagerImpl 로 나누어 테스트용이성과, 단일책임, 확장성을 확보하였습니다

Forbidden
기기에 설치된 앱을 icon과 이름, 등을 가져오기 구현
domain의 순수성을 지키기 위해
icon을 바로 받지 않고 viewmodel에서 packageName으로 가져오도록 구현

Home
설치된 앱의 실제 아이콘을 로드하는 비동기 로직(loadApps)을 구현하였습니다.
HomeScreenLazyColumn에서 appPackageName을 키(key)로 사용하고 contentType을 정의하여 리스트 렌더링 성능을 최적화하였습니다.

Uncompleted Tasks 😅

  • [ ]

📸 SCREENSHOT

sonms added 17 commits May 12, 2026 17:56
- `AndroidManifest.xml`에 앱 사용 기록 접근(`PACKAGE_USAGE_STATS`), 시스템 오버레이(`SYSTEM_ALERT_WINDOW`), 배터리 최적화 제외(`REQUEST_IGNORE_BATTERY_OPTIMIZATIONS`) 권한을 추가하였습니다.
- 알림 표시(`POST_NOTIFICATIONS`) 및 포그라운드 서비스(`FOREGROUND_SERVICE`, `FOREGROUND_SERVICE_SPECIAL_USE`) 관련 권한을 추가하였습니다.
- 인터넷 연결(`INTERNET`) 및 전체 패키지 조회(`QUERY_ALL_PACKAGES`) 권한을 설정하였습니다.
- `core:designsystem` 모듈에 URL을 통해 이미지를 로드하는 공통 컴포넌트인 `UrlImage`를 추가하였습니다.
- `UrlImage` 컴포넌트 구현을 위해 `coil-compose` 의존성을 `build.gradle.kts`에 추가하고 `AsyncImage`를 활용하도록 개발하였습니다.
- Compose Preview 환경에서 이미지 영역을 확인할 수 있도록 `LocalInspectionMode`일 때 표시될 플레이스홀더 이미지(`img_fake_red.xml`)를 추가하였습니다.
- `UrlImage`의 기본 `ContentScale` 설정을 `Fit`으로 지정하고, 외부에서 `Modifier` 및 설명을 주입받을 수 있도록 구성하였습니다.
- `core:permission` 모듈을 신규 생성하고 관련 빌드 설정(`build.gradle.kts`) 및 `AndroidManifest.xml`을 추가하였습니다.
- 권한 상태 확인 및 설정 페이지 이동을 담당하는 `PermissionManager` 인터페이스와 그 구현체인 `PermissionManagerImpl`을 작성하였습니다.
- `PermissionType` 열거형을 통해 USAGE_STATS, OVERLAY, BATTERY_OPTIMIZATION, POST_NOTIFICATIONS 등 관리 대상을 정의하였습니다.
- 각 권한별 실제 부여 여부를 체크하는 `PermissionChecker` 로직(AppOpsManager, Settings.canDrawOverlays 등 활용)을 구현하였습니다.
- 권한 관련 비즈니스 로직 처리를 위한 UseCase(`AreAllFocusPermissionsGrantedUseCase`, `CheckFocusPermissionsUseCase`)를 추가하였습니다.
- Hilt를 사용하여 `PermissionManager` 의존성 주입을 위한 `PermissionModule`을 구성하였습니다.
- `core:service` 모듈을 생성하고 `AndroidManifest.xml`, `build.gradle.kts`, `.gitignore` 등 기본 설정을 완료하였습니다.
- `core:service` 모듈에 `android-library` 및 `android-compose` 컨벤션 플러그인을 적용하였습니다.
- `core:work` 모듈을 생성하고 `AndroidManifest.xml`, `build.gradle.kts`, `.gitignore` 등 기본 설정을 완료하였습니다.
- `core:work` 모듈에 `android-library` 및 `hilt` 컨벤션 플러그인을 적용하였습니다.
- 각 모듈의 네임스페이스를 `core.service` 및 `core.work`로 설정하였습니다.
- `data:forbidden` 모듈을 신규 생성하고 `build.gradle.kts` 및 기본 프로젝트 설정을 완료하였습니다.
- `ForbiddenAppRepositoryImpl`을 구현하여 기기에 설치된 사용자 앱 목록을 가져오는 기능을 추가하였습니다.
    - `PackageManager`를 사용하여 `CATEGORY_LAUNCHER` 속성을 가진 앱들을 필터링하고 이름순으로 정렬하도록 구현하였습니다.
- Hilt를 이용한 의존성 주입을 위해 `ForbiddenRepositoryModule`을 추가하고 `ForbiddenAppRepository`를 바인딩하였습니다.
- `domain:forbidden` 모듈에 대한 의존성을 추가하였습니다.
- `presentation/build.gradle.kts`를 `domain/forbidden/build.gradle.kts`로 이동하고, `kindl.kotlin.jvm` 컨벤션 플러그인 및 `javax.inject` 의존성을 적용하였습니다.
- 설치된 앱 정보를 담는 `InstalledAppModel` 데이터 클래스를 추가하였습니다.
- 앱 목록 조회를 위한 `ForbiddenAppRepository` 인터페이스를 정의하였습니다.
- 의존성 주입(`@Inject`)을 지원하는 `GetInstalledAppsUseCase`를 구현하여 비즈니스 로직을 추가하였습니다.
- `domain/forbidden` 모듈에 대한 `.gitignore` 설정을 추가하였습니다.
- `presentation:home` 모듈을 신규 생성하고 기본 빌드 설정 및 ProGuard 규칙을 추가하였습니다.
- `presentation:main` 모듈에 `MainBottomBar` 컴포넌트를 추가하고 `MainTab`에 홈 항목을 정의하였습니다.
- `MainViewModel`, `MainUiState`, `MainSideEffect`를 추가하여 권한 체크 및 설정 이동 로직을 구현하였습니다.
- `MainScreen`에서 `Scaffold`와 `NavHost`를 활용하여 바텀바 표시 및 화면 전환 애니메이션(Slide) 설정을 추가하였습니다.
- `MainAppState`에 기본 시작 목적지(`Splash`)를 설정하고, `core:permission` 의존성을 추가하였습니다.
- `settings.gradle.kts` 내 모듈 정의 방식을 가독성 향상을 위해 그룹화된 `include` 형식으로 개선하였습니다.
- `core` 레이어에 `:core:permission`, `:core:service`, `:core:work` 모듈을 추가하였습니다.
- `data` 및 `domain` 레이어를 계층화하고 `:data:forbidden`, `:domain:forbidden` 모듈을 각각 추가하였습니다.
- `presentation` 레이어에 `:presentation:home` 모듈을 신규 추가하였습니다.
- `core:localstorage` 모듈을 신규 생성하고 DataStore 의존성 및 기본 빌드 설정을 추가하였습니다.
- `DataStoreConstant`를 정의하여 데이터스토어 이름과 알림 거절 횟수 기록을 위한 키(`notification_denied_count`)를 추가하였습니다.
- `PermissionInfoManager` 인터페이스와 `PermissionInfoManagerImpl` 구현체를 추가하여 알림 거절 횟수 저장 및 조회 로직을 구현하였습니다.
- Hilt를 이용한 의존성 주입을 위해 `LocalStorageModule`을 작성하고 `DataStore<Preferences>` 및 `PermissionInfoManager` 인스턴스 제공 설정을 완료하였습니다.
- `domain:forbidden` 모듈의 `build.gradle.kts`에 `kotlinx.immutable` 라이브러리 의존성을 추가하였습니다.
- `GetInstalledAppsUseCase`의 반환 타입을 `List`에서 `ImmutableList`로 변경하여 데이터의 불변성을 보장하고 안정성을 개선하였습니다.
- `presentation:home` 모듈에 `HomeScreen` 및 `HomeRoute`를 추가하고 `LazyColumn`을 사용하여 앱 목록 레이아웃을 구성하였습니다.
- `HomeViewModel`과 `HomeState`를 구현하여 `GetInstalledAppsUseCase`로부터 데이터를 가져오고 UI 상태를 관리하는 로직을 추가하였습니다.
- `ForbiddenAppUiModel` 및 `ForbiddenAppItem` 컴포넌트를 추가하여 각 앱 항목의 아이콘과 이름을 표시하도록 구현하였습니다.
- `HomeNavigation`을 정의하여 `NavGraph` 등록 및 화면 이동을 위한 `navigateToHome` 함수를 추가하였습니다.
- `domain:forbidden` 모듈에 대한 의존성을 추가하였습니다.
- `PermissionScreen`을 추가하여 필수 권한(사용 정보, 다른 앱 위에 표시, 배터리 최적화, 알림) 요청 및 설정 이동 UI를 구현하였습니다.
- `MainViewModel`에 `PermissionInfoManager`를 통합하여 알림 권한 거부 횟수 및 영구 거절 상태 관리 로직을 추가하였습니다.
- `MainScreen`에서 권한 미부여 시 `PermissionScreen`을 노출하도록 제어하고, 권한 종류 및 상태에 따른 요청 로직(런처 사용 또는 설정 앱 이동)을 세분화하였습니다.
- `MainAppState`의 시작 목적지를 `Home`으로 변경하고, `MainTab` 클릭 시 실제 화면 이동이 동작하도록 `NavHost` 설정을 업데이트하였습니다.
- `MainBottomBar`와 `MainTab`의 리소스 참조 방식을 개선하고, `presentation:home` 및 `core:localstorage` 의존성을 추가하였습니다.
- `UrlImage` 컴포넌트의 `url` 매개변수 타입을 `String`에서 `Any?`로 변경하여 다양한 이미지 소스 타입을 지원하도록 개선하였습니다.
- `app` 모듈의 `build.gradle.kts`에 `data:forbidden` 모듈 의존성을 추가하였습니다.
- `PermissionManagerImpl`에서 불필요한 `@Singleton` 어노테이션을 제거하고 미사용 임포트를 정리하였습니다.
- `ForbiddenRepositoryModule`의 코드 가독성 향상을 위해 공백을 추가하였습니다.
- `data` 및 `domain` 디렉토리 내의 불필요한 `.gitkeep` 파일을 삭제하였습니다.
- `ForbiddenAppUiModel`에서 `appIcon` 필드를 `icon: Drawable?`로 변경하고, 고유 식별을 위한 `appPackageName` 필드를 추가하였습니다.
- `HomeViewModel`에서 `PackageManager`를 사용하여 설치된 앱의 실제 아이콘을 로드하는 비동기 로직(`loadApps`)을 구현하였습니다.
- `HomeScreen`의 `LazyColumn`에서 `appPackageName`을 키(key)로 사용하고 `contentType`을 정의하여 리스트 렌더링 성능을 최적화하였습니다.
- `ForbiddenAppUiModel`의 어노테이션을 `@Immutable`에서 `@Stable`로 변경하였습니다.
- `presentation:main` 모듈의 패키지 경로 누락 수정 및 불필요한 import 구문을 정리하였습니다.
- `PermissionType`에 `ACCESSIBILITY`를 추가하고, `POST_NOTIFICATIONS`의 필수 여부(`isFocusRequired`)를 `false`로 변경하였습니다.
- `PermissionChecker`에 `Accessibility` 객체를 추가하여 앱의 접근성 서비스 활성화 여부를 확인하는 로직을 구현하였습니다.
- `PermissionManager` 인터페이스의 `openSettings` 반환 타입을 `Intent?`로 변경하고, `PermissionManagerImpl`에서 접근성 설정 화면으로 이동하는 인텐트 처리 로직을 추가하였습니다.
- `PermissionChecker.allGranted` 컴패니언 함수를 추가하여 모든 권한의 부여 상태를 한 번에 확인할 수 있도록 개선하였습니다.
- `PermissionChecker` 내 불필요한 어노테이션(`@SuppressLint`, `@Suppress`)을 제거하고 코드를 정리하였습니다.
- `PermissionScreen`에 `ACCESSIBILITY` 권한 타입을 추가하고, 권한 요청을 위한 UI 문구(접근 권한)를 정의하였습니다.
- `ForbiddenAppRepositoryImpl` 및 `ForbiddenRepositoryModule`에 `internal` 접근 제어자를 적용하여 모듈 내 캡슐화를 강화하였습니다.
- `MainSideEffect.OpenSettings`의 `intent` 매개변수 타입을 `Intent?`로 변경하여 Null 허용이 가능하도록 수정하였습니다.
@sonms sonms self-assigned this May 19, 2026
@sonms sonms merged commit 3572e9b into develop May 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 금지 앱 설정 목업 세팅

1 participant