diff --git a/app/src/main/java/fr/plnech/dunbar/Friend.kt b/app/src/main/java/fr/plnech/dunbar/Friend.kt new file mode 100644 index 0000000..f6c6a28 --- /dev/null +++ b/app/src/main/java/fr/plnech/dunbar/Friend.kt @@ -0,0 +1,26 @@ +package fr.plnech.dunbar + +import android.graphics.Bitmap +import android.provider.ContactsContract + +data class Friend(val map: MutableMap<String, String?>, val photo: Bitmap?) { + override fun toString(): String = "$id: $name ($timesContacted times, last $lastTime)" + + val name: String? + get() = map[ContactsContract.Contacts.DISPLAY_NAME] + + val id: String + get() = map[ContactsContract.Contacts._ID]!! + + val lastTime: String? + get() = map[ContactsContract.Contacts.LAST_TIME_CONTACTED] + + val timesContacted: String? + get() = map[ContactsContract.Contacts.TIMES_CONTACTED] + + val isYou: String? + get() = map[ContactsContract.Contacts.IS_USER_PROFILE] + + val visibleOutsideSearch: String? + get() = map[ContactsContract.Contacts.IN_DEFAULT_DIRECTORY] +} \ No newline at end of file diff --git a/app/src/main/java/fr/plnech/dunbar/Friends.kt b/app/src/main/java/fr/plnech/dunbar/Friends.kt deleted file mode 100644 index c9b26b0..0000000 --- a/app/src/main/java/fr/plnech/dunbar/Friends.kt +++ /dev/null @@ -1,5 +0,0 @@ -package fr.plnech.dunbar - -// * @see [contacts doc](https://developer.android.com/training/contacts-provider/retrieve-names) -class Friends { -} \ No newline at end of file diff --git a/app/src/main/java/fr/plnech/dunbar/MainActivity.kt b/app/src/main/java/fr/plnech/dunbar/MainActivity.kt index 483ffc0..3f6ca05 100644 --- a/app/src/main/java/fr/plnech/dunbar/MainActivity.kt +++ b/app/src/main/java/fr/plnech/dunbar/MainActivity.kt @@ -1,7 +1,11 @@ package fr.plnech.dunbar +import android.content.ContentUris +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.os.Bundle import android.provider.ContactsContract +import android.util.Log import android.view.Menu import android.view.MenuItem import android.widget.ArrayAdapter @@ -10,20 +14,18 @@ import androidx.appcompat.app.AppCompatActivity import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.content_main.* +import java.io.IOException class MainActivity : AppCompatActivity() { - private val CONTENT_VIEW_ID = 10101010 + private val friends = mutableListOf<Friend>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) - - - fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() @@ -49,6 +51,8 @@ class MainActivity : AppCompatActivity() { } fun fetchFriends() { + Toast.makeText(this@MainActivity, "Fetching friends...", Toast.LENGTH_SHORT).show() + contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, @@ -56,31 +60,65 @@ class MainActivity : AppCompatActivity() { null, null )?.let { - - val contacts = mutableListOf<List<Pair<String, String>>>() while (it.moveToNext()) { - contacts.add(mutableListOf<Pair<String, String>>().also { contact -> + mutableMapOf<String, String?>().also { map -> + + val indexID = it.getColumnIndex(ContactsContract.Contacts._ID) + val id = it.getLong(indexID) + val photo: Bitmap? = getPhoto(id) + it.columnNames.forEach { name -> - contact.add(Pair(name, it.getString(it.getColumnIndex(name)))) + val index = it.getColumnIndex(name) + map[name] = it.getString(index) } - }) + friends.add(Friend(map, photo)) + } } - friends.adapter = - ArrayAdapter<String>(this, R.layout.contact, R.id.name, - contacts.map { contact -> - contact.filter { !it.second.isNullOrBlank() } - .joinToString { "${it.first}:${it.second}" } - }) + val adapter = ArrayAdapter<Friend>( + this, R.layout.contact, R.id.name, + friends + ) - val nbFriends = friends.adapter.count + friendsList.adapter = adapter + friendsList.setOnItemClickListener { parent, view, position, id -> + val contact: String = adapter.getItem(position)?.toString() ?: "NONE" + +// Snackbar.make(friendsList, contact, Snackbar.LENGTH_INDEFINITE).show() + Toast.makeText(this, contact, Toast.LENGTH_LONG).show() + } + + val nbFriends = adapter.count welcomeTitle.text = "$nbFriends ${"friend".plural(nbFriends)} on Dunbar" Toast.makeText(this@MainActivity, "$nbFriends ", Toast.LENGTH_LONG).show() - it?.close() + it.close() } } + + private fun getPhoto(id: Long): Bitmap? { + var photo: Bitmap? = null + + try { + val inputStream = ContactsContract.Contacts.openContactPhotoInputStream( + contentResolver, ContentUris.withAppendedId( + ContactsContract.Contacts.CONTENT_URI, + java.lang.Long.valueOf(id) + ) + ) + + if (inputStream != null) { + photo = BitmapFactory.decodeStream(inputStream) + } + + inputStream?.close() + } catch (e: IOException) { + e.printStackTrace() + } + Log.d("--> ", photo.toString()) + return photo + } } diff --git a/app/src/main/res/drawable/user.jpeg b/app/src/main/res/drawable/user.jpeg new file mode 100644 index 0000000..139dc99 Binary files /dev/null and b/app/src/main/res/drawable/user.jpeg differ diff --git a/app/src/main/res/layout/contact.xml b/app/src/main/res/layout/contact.xml index e423727..bf8fbe4 100644 --- a/app/src/main/res/layout/contact.xml +++ b/app/src/main/res/layout/contact.xml @@ -14,30 +14,33 @@ <ImageView android:id="@+id/pic" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="10dp" + android:layout_width="150dp" + android:layout_height="100dp" + android:layout_marginTop="5dp" + android:layout_marginEnd="10dp" + android:layout_marginBottom="5dp" android:height="150dp" - android:src="@android:drawable/" + android:contentDescription="TODO" android:elevation="2dp" + android:src="@drawable/user" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@id/name" - app:layout_constraintTop_toTopOf="parent" - tools:src="@tools:sample/avatars" - android:contentDescription="TODO" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="15dp" - android:clickable="true" - android:focusable="true" - android:maxLines="2" + android:layout_margin="15dp" + android:focusable="false" + android:focusableInTouchMode="false" + android:gravity="end" + android:maxLines="3" android:textAppearance="@style/TextAppearance.AppCompat.Title" - android:textSize="32sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintLeft_toRightOf="@id/pic" app:layout_constraintRight_toLeftOf="@id/name" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index 946822d..b6e750a 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -15,15 +15,14 @@ android:layout_height="wrap_content" tools:text="N friends on Dunbar" android:textSize="24sp" - app:layout_constraintBottom_toTopOf="@id/friends" + app:layout_constraintBottom_toTopOf="@id/friendsList" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ListView - android:id="@+id/friends" + android:id="@+id/friendsList" android:layout_width="match_parent" - android:padding="10dp" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"