Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public final View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewG
}

@Override
public final void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
postponeEnterTransition(200, TimeUnit.MILLISECONDS);

var manager = getChildFragmentManager();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
package eu.jonahbauer.qed.activities.mainFragments;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.MenuProvider;
import androidx.lifecycle.Lifecycle;

import java.util.function.Supplier;

import eu.jonahbauer.qed.R;
import eu.jonahbauer.qed.activities.sheets.InfoFragment;
import eu.jonahbauer.qed.activities.sheets.person.PersonInfoFragment;
import eu.jonahbauer.qed.model.Person;
import eu.jonahbauer.qed.model.viewmodel.InfoViewModel;
import eu.jonahbauer.qed.model.viewmodel.PersonViewModel;
import eu.jonahbauer.qed.util.Actions;
import eu.jonahbauer.qed.util.Themes;
import eu.jonahbauer.qed.util.ViewUtils;
import lombok.RequiredArgsConstructor;

public class PersonFragment extends MainInfoFragment {

Expand All @@ -24,8 +38,24 @@ public void onCreateViewModel() {
mPersonViewModel.load(person);

setColor(Themes.colorful(requireContext(), person.getId()));


}

@Override
public final void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

PersonFragmentArgs args = PersonFragmentArgs.fromBundle(getArguments());
Person person = args.getPerson();
if (person != null) {
var menuProvider = new ExportContactMenuProvider(person);
requireActivity().addMenuProvider(menuProvider, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
}
}



@Override
public @NonNull InfoFragment createFragment() {
return PersonInfoFragment.newInstance();
Expand All @@ -35,4 +65,25 @@ public void onCreateViewModel() {
public @NonNull InfoViewModel<?> getInfoViewModel() {
return mPersonViewModel;
}

@RequiredArgsConstructor
private class ExportContactMenuProvider implements MenuProvider {

@NonNull
private final Person person;

@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
menuInflater.inflate(R.menu.menu_export_contact, menu);
}

@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
if (menuItem.getItemId() == R.id.export_contact) {
Actions.exportToAddressBook(getContext(), person);
return true;
}
return false;
}
}
}
1 change: 1 addition & 0 deletions app/src/main/java/eu/jonahbauer/qed/model/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ public class Person implements Parcelable {
private Instant loaded;

// Pair of type and number/name
@NonNull
private final Set<Pair<String, String>> contacts = new LinkedHashSet<>();
private final Set<String> addresses = new LinkedHashSet<>();
private final Set<Registration> events = new ObjectLinkedOpenCustomHashSet<>(Registration.STRATEGY_ID);
Expand Down
65 changes: 65 additions & 0 deletions app/src/main/java/eu/jonahbauer/qed/util/Actions.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.CalendarContract;
import android.provider.ContactsContract;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Pair;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;

Expand All @@ -27,6 +29,8 @@

import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.LinkedHashSet;

import lombok.experimental.UtilityClass;

Expand Down Expand Up @@ -94,6 +98,67 @@ public static boolean recordToCalendar(@NonNull Context context, @NonNull Event
return tryStartActivity(context, intent);
}

/**
* Launches an {@link Intent} to {@linkplain Intent#ACTION_INSERT insert} the given person into the contact book.
* The following attributes are included:
* <ul>
* <li>the {@linkplain Person::getFullName full name},</li>
* <li>the {@linkplain Person::getPhone phone number},</li>
* <li>the {@linkplain Person::getEmail mail address}.</li>
* </ul>
*/
public static boolean exportToAddressBook(@NonNull Context context, @NonNull Person person) {
Intent intent = new Intent(Intent.ACTION_INSERT)
.setType(ContactsContract.Contacts.CONTENT_TYPE)
.putExtra(ContactsContract.Intents.Insert.NAME, person.getFullName())
.putExtra(ContactsContract.Intents.Insert.NOTES, "QED");
if(person.getEmail() != null)
intent.putExtra(ContactsContract.Intents.Insert.EMAIL, person.getEmail());
var contacts = person.getContacts();
var data = new ArrayList<ContentValues>();
var numPhones = 0;
for (var contact : contacts) {
switch (contact.first.toLowerCase()) {
case "daheim":
case "mobil":
case "phone":
case "telefon":
case "festnetz":
if(numPhones > 2) break;
String phoneType, phone;
switch(numPhones){
case 0:
phone = ContactsContract.Intents.Insert.PHONE;
phoneType = ContactsContract.Intents.Insert.PHONE_TYPE;
break;
case 1:
phone = ContactsContract.Intents.Insert.SECONDARY_PHONE;
phoneType = ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE;
break;
default:
phone = ContactsContract.Intents.Insert.TERTIARY_PHONE;
phoneType = ContactsContract.Intents.Insert.TERTIARY_PHONE;
break;
};
intent.putExtra(phoneType, contact.first);
intent.putExtra(phone, contact.second);
numPhones++;
break;
default:
var row = new ContentValues();
row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE);
row.put(ContactsContract.CommonDataKinds.Im.DATA, contact.second);
row.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM);
row.put(ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL, contact.first);
data.add(row);
break;
}
}
intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);

return tryStartActivity(context, intent);
}

/**
* Launches an {@link Intent} to {@linkplain Intent#ACTION_DIAL dial} {@code tel:${phoneNumber}}.
* @return {@code true} when a suitable activity was found and started
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/res/menu/menu_export_contact.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

<item
android:id="@+id/export_contact"
android:title="@string/export_contact"
android:icon="@drawable/ic_menu_download"
app:showAsAction="ifRoom" />

</menu>
1 change: 1 addition & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<string name="hits">%,d Treffer</string>
<string name="info">Details</string>
<string name="open_in_browser">Öffne im Browser</string>
<string name="export_contact">Kontakt speichern</string>
<string name="range">%s - %s</string>
<string name="refresh">Aktualisieren</string>
<string name="retry">Erneut versuchen</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<string name="hits">%,d Hits</string>
<string name="info">Details</string>
<string name="open_in_browser">Open in browser</string>
<string name="export_contact">Export contact</string>
<string name="range">%s - %s</string>
<string name="refresh">Refresh</string>
<string name="retry">Retry</string>
Expand Down