Features: - LDAP contact management (CRUD) - Search by name, phone, company - Call/SMS integration - Android contacts sync for caller ID - Material Design 3 UI LDAP Structure: - uid-based DN for flexible cn modification - Attributes: cn, displayName, mobile, mail, o, ou, title
122 lines
3.4 KiB
Markdown
122 lines
3.4 KiB
Markdown
# LDAPContacts (외부 주소록)
|
|
|
|
LDAP 서버와 연동하여 연락처를 관리하는 Android 앱입니다.
|
|
|
|
## 주요 기능
|
|
|
|
- **LDAP 연락처 조회**: LDAP 서버에서 연락처 목록 조회
|
|
- **검색**: 이름, 전화번호, 회사명으로 검색
|
|
- **연락처 추가/수정/삭제**: LDAP 서버에 연락처 CRUD
|
|
- **전화/문자**: 연락처에서 바로 전화 걸기, 문자 보내기
|
|
- **Android 연락처 동기화**: LDAP 연락처를 Android 기본 연락처에 동기화 (발신자 표시용)
|
|
|
|
## 기술 스택
|
|
|
|
- **Language**: Kotlin
|
|
- **UI**: Android View Binding, Material Design 3
|
|
- **LDAP**: UnboundID LDAP SDK
|
|
- **Async**: Kotlin Coroutines
|
|
|
|
## LDAP 구조
|
|
|
|
### DN (Distinguished Name) 형식
|
|
```
|
|
uid={uuid},ou=ioresponse,ou=users,dc=ioresponse,dc=net
|
|
```
|
|
|
|
uid 기반 DN을 사용하여 cn(이름) 수정이 자유롭습니다.
|
|
|
|
### 사용하는 LDAP 속성
|
|
|
|
| 속성 | 설명 | 앱 필드 |
|
|
|------|------|---------|
|
|
| uid | 고유 식별자 (UUID) | - |
|
|
| cn | 이름 | 이름 |
|
|
| displayName | 별명/닉네임 | 별명 |
|
|
| telephoneNumber | 전화번호 | 전화번호 |
|
|
| mobile | 휴대폰번호 | 전화번호 (우선) |
|
|
| mail | 이메일 | 이메일 |
|
|
| o | 회사/조직 | 회사 |
|
|
| ou | 부서 | 부서 |
|
|
| title | 직함 | 직함 |
|
|
|
|
### 이름 표시 로직
|
|
- `displayName`이 있으면 displayName 표시
|
|
- 없으면 `cn` 표시
|
|
|
|
## 주요 소스 파일
|
|
|
|
```
|
|
app/src/main/java/net/ioresponse/ldapcontacts/
|
|
├── MainActivity.kt # 메인 화면 (연락처 목록)
|
|
├── ContactDetailActivity.kt # 연락처 상세 화면
|
|
├── EditContactActivity.kt # 연락처 추가/수정 화면
|
|
├── SettingsActivity.kt # LDAP 서버 설정
|
|
├── Contact.kt # 연락처 데이터 모델
|
|
├── ContactAdapter.kt # RecyclerView 어댑터
|
|
├── LdapManager.kt # LDAP 통신 관리
|
|
└── ContactSyncManager.kt # Android 연락처 동기화
|
|
```
|
|
|
|
## LdapManager 주요 함수
|
|
|
|
```kotlin
|
|
// 전체 연락처 조회
|
|
suspend fun getContacts(): Result<List<Contact>>
|
|
|
|
// 연락처 검색 (이름, 전화번호, 회사명)
|
|
suspend fun searchContacts(query: String): Result<List<Contact>>
|
|
|
|
// DN으로 연락처 조회
|
|
suspend fun getContactByDn(dn: String): Contact?
|
|
|
|
// 연락처 추가
|
|
suspend fun addContact(contact: Contact): Result<Unit>
|
|
|
|
// 연락처 수정
|
|
suspend fun updateContact(contact: Contact): Result<Unit>
|
|
|
|
// 연락처 삭제
|
|
suspend fun deleteContact(contact: Contact): Result<Unit>
|
|
```
|
|
|
|
## 연락처 동기화 로직
|
|
|
|
`ContactSyncManager.kt`에서 Android 기본 연락처에 동기화:
|
|
|
|
1. **기존 연락처 전체 삭제** (CALLER_IS_SYNCADAPTER 사용)
|
|
2. **휴지통 비우기 시도**
|
|
3. **LDAP 연락처 추가**
|
|
|
|
> 삼성 기기에서는 휴지통 자동 비우기가 동작하지 않아 사용자가 수동으로 비워야 합니다.
|
|
|
|
## 빌드 방법
|
|
|
|
```bash
|
|
# Debug APK 빌드
|
|
./gradlew assembleDebug
|
|
|
|
# APK 위치
|
|
app/build/outputs/apk/debug/app-debug.apk
|
|
```
|
|
|
|
## 설정
|
|
|
|
앱 실행 후 설정 화면에서 LDAP 서버 정보 입력:
|
|
|
|
- **서버**: LDAP 서버 주소
|
|
- **포트**: LDAP 포트 (기본 389)
|
|
- **Bind DN**: 인증용 DN (예: cn=Directory Manager)
|
|
- **비밀번호**: Bind DN 비밀번호
|
|
- **Base DN**: 검색 기준 DN
|
|
|
|
## 권한
|
|
|
|
- `INTERNET`: LDAP 서버 연결
|
|
- `READ_CONTACTS`, `WRITE_CONTACTS`: Android 연락처 동기화
|
|
- `CALL_PHONE`: 전화 걸기
|
|
|
|
## 라이선스
|
|
|
|
Private - ioresponse.net
|