blob: 2442c0e1f081025de7723c4960c18c900335acb2 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package examples.baku.io.permissions.examples;
import android.Manifest;
import android.app.Service;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ValueEventListener;
import com.joanzapata.iconify.IconDrawable;
import com.joanzapata.iconify.fonts.MaterialIcons;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import examples.baku.io.permissions.Blessing;
import examples.baku.io.permissions.PermissionManager;
import examples.baku.io.permissions.PermissionRequest;
import examples.baku.io.permissions.PermissionService;
import examples.baku.io.permissions.PermissionedTextLayout;
import examples.baku.io.permissions.R;
import examples.baku.io.permissions.discovery.DeviceData;
import examples.baku.io.permissions.discovery.DevicePickerActivity;
import examples.baku.io.permissions.synchronization.SyncText;
import examples.baku.io.permissions.synchronization.SyncTextDiff;
import examples.baku.io.permissions.util.Utils;
public class ComposeActivity extends AppCompatActivity implements ServiceConnection {
public final static String EXTRA_MESSAGE_ID = "messageId";
public final static String EXTRA_MESSAGE_PATH = "messagePath";
private final static int SELECT_ATTACHMENT = 1232;
private String mPath;
private String mOwner;
private String mDeviceId;
private String mId;
private PermissionService mPermissionService;
private PermissionManager mPermissionManager;
private DatabaseReference mMessageRef;
private DatabaseReference mSyncedMessageRef;
private Blessing mSourceBlessing;
private Blessing mPublicBlessing;
private final Set<String> targetDevices = new HashSet<>();
private String mGroup;
private String mAttachment;
private int mAttachmentPermission;
private RelativeLayout mAttachmentView;
private TextView mAttachmentText;
private ImageView mAttachmentIcon;
private ImageView mAttachmentCast;
private PermissionedTextLayout mTo;
private PermissionedTextLayout mFrom;
private PermissionedTextLayout mSubject;
private PermissionedTextLayout mMessage;
private Multimap<String, PermissionRequest> mRequests = HashMultimap.create();
private HashMap<String, PermissionedTextLayout> mPermissionedFields = new HashMap<>();
private HashMap<String, Integer> mPermissions = new HashMap<>();
private HashMap<String, SyncText> syncTexts = new HashMap<>();
private ArrayAdapter<String> contactAdapter;
FloatingActionButton mFab;
private Menu mMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compose);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Compose");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setTitle("Compose");
mFab = (FloatingActionButton) findViewById(R.id.fab);
mTo = (PermissionedTextLayout) findViewById(R.id.composeTo);
mFrom = (PermissionedTextLayout) findViewById(R.id.composeFrom);
mSubject = (PermissionedTextLayout) findViewById(R.id.composeSubject);
mMessage = (PermissionedTextLayout) findViewById(R.id.composeMessage);
mMessage.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
mAttachmentView = (RelativeLayout) findViewById(R.id.composeAttachment);
mAttachmentText = (TextView) findViewById(R.id.composeAttachmentText);
mAttachmentIcon = (ImageView) findViewById(R.id.composeAttachmentIcon);
mAttachmentIcon.setImageDrawable(new IconDrawable(this, MaterialIcons.md_attach_file).actionBarSize());
mAttachmentCast = (ImageView) findViewById(R.id.composeAttachmentCast);
mAttachmentCast.setImageDrawable(new IconDrawable(this, MaterialIcons.md_cast).actionBarSize());
mAttachmentCast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPublicBlessing != null){
int current = mPublicBlessing.getPermissions(mPath + "/attachment");
if((current & PermissionManager.FLAG_READ) == PermissionManager.FLAG_READ){
mPublicBlessing.setPermissions(mPath + "/attachment", current & ~PermissionManager.FLAG_READ);
mAttachmentCast.setImageDrawable(new IconDrawable(ComposeActivity.this, MaterialIcons.md_cast).actionBarSize());
}else{
mPublicBlessing.setPermissions(mPath + "/attachment", current | PermissionManager.FLAG_READ);
mAttachmentCast.setImageDrawable(new IconDrawable(ComposeActivity.this, MaterialIcons.md_cancel).color(Color.RED).actionBarSize());
}
}
}
});
mAttachmentCast.setVisibility(View.GONE);
setGroup("Inbox"); //default
setAttachment(null, mAttachmentPermission);
getContactsPermission();
bindService(new Intent(this, PermissionService.class), this, Service.BIND_AUTO_CREATE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_compose, menu);
menu.findItem(R.id.action_cast).setIcon(
new IconDrawable(this, MaterialIcons.md_cast)
.color(Color.WHITE)
.actionBarSize());
MenuItem deleteItem = menu.findItem(R.id.action_delete);
MenuItem attachItem = menu.findItem(R.id.action_attach).setIcon(
new IconDrawable(this, MaterialIcons.md_attach_file)
.color(Color.WHITE)
.actionBarSize());
attachItem.setVisible(false);
if (mOwner == null || !mOwner.equals(mDeviceId)) {
attachItem.setVisible(false);
deleteItem.setVisible(false);
}
mMenu = menu;
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_delete) {
checkAndSendMessage(); //currently send and delete have the same result
} else if (id == R.id.action_cast) {
if (mPermissionService != null) {
Intent requestIntent = new Intent(ComposeActivity.this, DevicePickerActivity.class);
requestIntent.putExtra(DevicePickerActivity.EXTRA_REQUEST, DevicePickerActivity.REQUEST_DEVICE_ID);
requestIntent.putExtra(DevicePickerActivity.EXTRA_REQUEST_ARGS, mPath);
startActivityForResult(requestIntent, DevicePickerActivity.REQUEST_DEVICE_ID);
}
} else if (id == R.id.action_attach) {
pickAttachment();
} else if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
public void getContactsPermission() {
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
1);
}
} else { //already granted
onContactsPermissionGranted();
}
}
private void setGroup(String group) {
mGroup = group;
boolean editable = false;
if ("Inbox".equals(group)) {
mFab.setImageDrawable(new IconDrawable(this, MaterialIcons.md_reply).color(Color.WHITE));
mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchAndCreateMessage(ComposeActivity.this, mMessageRef.getParent(), mFrom.getText(), "myself@email.com", "RE: " + mSubject.getText(), "", null, "Drafts");
}
});
} else if ("Drafts".equals(group)) {
editable = true;
mFab.setImageDrawable(new IconDrawable(this, MaterialIcons.md_send).color(Color.WHITE));
if (mOwner == null || !mOwner.equals(mDeviceId)) {
if (mMenu != null) {
mMenu.findItem(R.id.action_delete).setVisible(false);
}
mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ComposeActivity.this, "Can't send message from this device", 0).show();
}
});
} else {
mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAndSendMessage();
}
});
}
if (mMenu != null) {
mMenu.findItem(R.id.action_attach).setVisible(true);
}
} else if ("Sent".equals(group)) {
mFab.setImageDrawable(new IconDrawable(this, MaterialIcons.md_forward).color(Color.WHITE));
mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchAndCreateMessage(ComposeActivity.this, mMessageRef.getParent(), "", "myself@email.com", "FWD: " + mSubject.getText(), mMessage.getText(), null, "Drafts");
}
});
if (mMenu != null) {
mMenu.findItem(R.id.action_attach).setVisible(true);
}
}
mTo.setEditable(editable);
mSubject.setEditable(editable);
mMessage.setEditable(editable);
}
public void setAttachment(final String attachment, final int permission) {
this.mAttachment = attachment;
this.mAttachmentPermission = permission;
if (attachment == null || (permission & PermissionManager.FLAG_READ) != PermissionManager.FLAG_READ) {
mAttachmentView.setVisibility(View.GONE);
} else {
mAttachmentView.setVisibility(View.VISIBLE);
mAttachmentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.viewAttachment(ComposeActivity.this, attachment);
}
});
mAttachmentText.setText(attachment);
}
}
public static void launchAndCreateMessage(Context context, DatabaseReference messagesRef, String to, String from, String subject, String msg, String attachment, String group) {
MessageData data = new MessageData(UUID.randomUUID().toString(), to, from, subject, msg, attachment, group);
messagesRef.child(data.getId()).setValue(data);
Intent intent = new Intent(context, ComposeActivity.class);
intent.putExtra(ComposeActivity.EXTRA_MESSAGE_ID, data.getId());
context.startActivity(intent);
}
private void onContactsPermissionGranted() {
ArrayList<String> emailAddressCollection = new ArrayList<String>();
ContentResolver cr = getContentResolver();
Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null, null, null);
while (emailCur.moveToNext()) {
String email = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
emailAddressCollection.add(email);
}
emailCur.close();
String[] emailAddresses = new String[emailAddressCollection.size()];
emailAddressCollection.toArray(emailAddresses);
contactAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, emailAddresses);
mTo.setAutoCompleteAdapter(contactAdapter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//TODO: generalize to other permissions. Not just contacts
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onContactsPermissionGranted();
}
}
ArrayList<SyncTextDiff> getSuggestions() {
ArrayList<SyncTextDiff> result = new ArrayList<>();
result.addAll(mTo.getSuggestions());
result.addAll(mFrom.getSuggestions());
result.addAll(mSubject.getSuggestions());
result.addAll(mMessage.getSuggestions());
return result;
}
void checkAndSendMessage() {
//TODO: PermissionManager.requestDialog()
mPermissionManager.request(mPath + "/send", mDeviceId)
.putExtra(PermissionManager.EXTRA_TIMEOUT, "2000")
.putExtra(PermissionManager.EXTRA_COLOR, "#F00");
if (getSuggestions().size() > 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Confirm suggestions before sending message");
builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
sendMessage();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
sendMessage();
}
}
public void sendMessage() {
mMessageRef.child("group").setValue("Sent");
for (String device : targetDevices) {
mPermissionService.removeFromConstellation(device);
}
finish();
}
private void deleteMessage() {
if ((mPermissionManager.getPermissions(mPath) & PermissionManager.FLAG_WRITE) == PermissionManager.FLAG_WRITE) {
mMessageRef.removeValue();
}
finish();
}
private void pickAttachment() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
// Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath());
intent.setType("*/*");
// intent.setDataAndType(uri, "file/*");
startActivityForResult(Intent.createChooser(intent, "Choose Attachment"), SELECT_ATTACHMENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == DevicePickerActivity.REQUEST_DEVICE_ID && data != null && data.hasExtra(DevicePickerActivity.EXTRA_DEVICE_ID)) {
String targetDevice = data.getStringExtra(DevicePickerActivity.EXTRA_DEVICE_ID);
if (!mOwner.equals(targetDevice)) {
//find most appropriate blessing to extend from
mSourceBlessing = mPermissionManager.getBlessing(mOwner, mDeviceId);
if (mSourceBlessing == null) {
mSourceBlessing = mPermissionManager.getRootBlessing();
}
//set default blessings
// Blessing deviceBlessing = mSourceBlessing.bless(targetDevice)
// .setPermissions(mPath + "/to", PermissionManager.FLAG_SUGGEST)
// .setPermissions(mPath + "/subject", PermissionManager.FLAG_SUGGEST)
// .setPermissions(mPath + "/message", PermissionManager.FLAG_SUGGEST);
addTargetDevice(targetDevice);
}
JSONObject castArgs = new JSONObject();
try {
castArgs.put("activity", ComposeActivity.class.getSimpleName());
castArgs.put(EXTRA_MESSAGE_PATH, mPath);
mPermissionService.getMessenger().to(targetDevice).emit("cast", castArgs.toString());
mPermissionService.updateConstellationDevice(targetDevice);
} catch (JSONException e) {
e.printStackTrace();
}
} else if (requestCode == SELECT_ATTACHMENT && resultCode == RESULT_OK) {
Uri attachmentUri = data.getData();
// String path = Utils.getRealPathFromURI(this, attachmentUri);
String path = Utils.getFileName(this, attachmentUri);
// File f = new File(path);
Toast.makeText(this, "Attached " + path, 0).show();
mMessageRef.child("attachment").setValue(path);
}
}
public void addTargetDevice(String id) {
targetDevices.add(id);
for (Map.Entry<String, PermissionedTextLayout> entry : mPermissionedFields.entrySet()) {
PermissionedTextLayout edit = entry.getValue();
String key = entry.getKey();
int current = mPublicBlessing.getPermissions(mPath + "/" + key);
if ((current & PermissionManager.FLAG_SUGGEST) == PermissionManager.FLAG_SUGGEST) {
edit.setAction(1, new IconDrawable(ComposeActivity.this, MaterialIcons.md_cancel)
.color(Color.RED)
.actionBarSize(), "Toggle Permission");
} else {
edit.setAction(1, new IconDrawable(ComposeActivity.this, MaterialIcons.md_cast)
.color(Color.BLACK)
.actionBarSize(), "Toggle Permission");
}
}
mAttachmentCast.setVisibility(View.VISIBLE);
}
public void removeTargetDevice(String id) {
targetDevices.remove(id);
if (targetDevices.size() == 0) {
for (Map.Entry<String, PermissionedTextLayout> entry : mPermissionedFields.entrySet()) {
PermissionedTextLayout edit = entry.getValue();
edit.clearActions();
}
mAttachmentCast.setVisibility(View.GONE);
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
PermissionService.PermissionServiceBinder binder = (PermissionService.PermissionServiceBinder) service;
mPermissionService = binder.getInstance();
if (mPermissionService != null) {
mPermissionManager = mPermissionService.getPermissionManager();
mDeviceId = mPermissionService.getDeviceId();
Intent intent = getIntent();
if (intent != null) {
if (intent.hasExtra(EXTRA_MESSAGE_PATH)) {
mPath = intent.getStringExtra(EXTRA_MESSAGE_PATH);
String[] pathElements = mPath.split("/");
mId = pathElements[pathElements.length - 1];
} else if (intent.hasExtra(EXTRA_MESSAGE_ID)) {
mId = intent.getStringExtra(EXTRA_MESSAGE_ID);
mPath = EmailActivity.KEY_DOCUMENTS
+ "/" + mDeviceId
+ "/" + EmailActivity.KEY_EMAILS
+ "/" + EmailActivity.KEY_MESSAGES
+ "/" + mId;
}
}
if (mPath == null) {
mId = UUID.randomUUID().toString();
mPath = "documents/" + mDeviceId + "/emails/messages/" + mId;
}
//parse path to get owner
String[] pathElements = mPath.split("/");
if (pathElements != null && pathElements.length > 1) {
mOwner = pathElements[1];
}
if (mMenu != null && !mOwner.equals(mDeviceId)) {
mMenu.findItem(R.id.action_attach).setVisible(false);
mMenu.findItem(R.id.action_delete).setVisible(false);
}
mMessageRef = mPermissionService.getFirebaseDB().getReference(mPath);
mSyncedMessageRef = mPermissionService.getFirebaseDB().getReference("documents/" + mOwner + "/emails/syncedMessages/" + mId);
mPermissionManager.addPermissionEventListener(mPath, messagePermissionListener);
mMessageRef.child("group").addValueEventListener(groupListener);
mMessageRef.child("attachment").addValueEventListener(attachmentListener);
mPermissionManager.addPermissionEventListener(mPath + "/attachment", attachmentPermissionListner);
initField(mTo, "to");
initField(mFrom, "from");
initField(mSubject, "subject");
initField(mMessage, "message");
mPublicBlessing = mPermissionManager.bless("public");
// .setPermissions(mPath + "/subject", PermissionManager.FLAG_READ);
mPermissionManager.addOnRequestListener("documents/" + mDeviceId + "/emails/messages/" + mId + "/*", new PermissionManager.OnRequestListener() {
@Override
public boolean onRequest(PermissionRequest request, Blessing blessing) {
mRequests.put(request.getPath(), request);
return true;
}
@Override
public void onRequestRemoved(PermissionRequest request, Blessing blessing) {
}
});
mPermissionService.setStatus(EXTRA_MESSAGE_PATH, mPath);
mPermissionService.addDiscoveryListener(new PermissionService.DiscoveryListener() {
@Override
public void onChange(Map<String, DeviceData> devices) {
}
@Override
public void onDisassociate(String deviceId) {
if (deviceId.equals(mOwner)) {
finish();
}else{
removeTargetDevice(deviceId);
}
}
});
}
}
PermissionManager.OnPermissionChangeListener attachmentPermissionListner = new PermissionManager.OnPermissionChangeListener() {
@Override
public void onPermissionChange(int current) {
setAttachment(mAttachment, current);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
ValueEventListener groupListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String newGroup = dataSnapshot.getValue(String.class);
setGroup(newGroup);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
ValueEventListener attachmentListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String newAttachment = dataSnapshot.getValue(String.class);
setAttachment(newAttachment, mAttachmentPermission);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
PermissionManager.OnPermissionChangeListener messagePermissionListener = new PermissionManager.OnPermissionChangeListener() {
@Override
public void onPermissionChange(int current) {
if (current > 0) {
mMessageRef.child("id").setValue(mId);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
@Override
public void onServiceDisconnected(ComponentName name) {
}
void initField(final PermissionedTextLayout edit, final String key) {
edit.setSyncText(new SyncText(mDeviceId, PermissionManager.FLAG_SUGGEST, mSyncedMessageRef.child(key), mMessageRef.child(key)));
edit.setPermissionedTextListener(new PermissionedTextLayout.PermissionedTextListener() {
@Override
public void onSelected(final SyncTextDiff diff, PermissionedTextLayout text) {
int current = mPermissionManager.getPermissions(mPath + "/" + key);
if ((current & PermissionManager.FLAG_WRITE) == PermissionManager.FLAG_WRITE) {
Intent content = new Intent(ComposeActivity.this, ComposeActivity.class);
content.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
String name = diff.getSource();
if(mPermissionService.getDiscovered().containsKey(name)){
name = mPermissionService.getDiscovered().get(diff.source).getName();
}
mPermissionService.requestDialog(diff.source, "Apply changes from " + name, "be vigilant",
new PermissionService.ActionCallback() {
@Override
public boolean onAction(Intent intent) {
acceptSuggestions(diff.source);
return true;
}
}, new PermissionService.ActionCallback() {
@Override
public boolean onAction(Intent intent) {
rejectSuggestions(diff.source);
return true;
}
}, content);
}
}
@Override
public void onAction(int action, PermissionedTextLayout text) {
if (action == 1) {
if (mPublicBlessing != null) {
int current = mPublicBlessing.getPermissions(mPath + "/" + key);
if ((current & PermissionManager.FLAG_SUGGEST) == PermissionManager.FLAG_SUGGEST) {
mPublicBlessing.setPermissions(mPath + "/" + key, current & ~PermissionManager.FLAG_SUGGEST);
text.setAction(1, new IconDrawable(ComposeActivity.this, MaterialIcons.md_cast)
.color(Color.BLACK)
.actionBarSize(), "Toggle Permission");
} else {
mPublicBlessing.setPermissions(mPath + "/" + key, current | PermissionManager.FLAG_SUGGEST);
text.setAction(1, new IconDrawable(ComposeActivity.this, MaterialIcons.md_cancel)
.color(Color.RED)
.actionBarSize(), "Toggle Permission");
}
}
} else if (action == 2) {
mPermissionManager.request(mPath + "/to", mDeviceId)
.setPermissions(PermissionManager.FLAG_WRITE)
.udpate();
}
}
});
mPermissionedFields.put(key, edit);
final String path = "documents/" + mDeviceId + "/emails/messages/" + mId + "/" + key;
mPermissionManager.addPermissionEventListener(mPath + "/" + key, new PermissionManager.OnPermissionChangeListener() {
@Override
public void onPermissionChange(int current) {
edit.onPermissionChange(current);
//TODO:generalize the following request button
if ("to".equals(key)) {
if (current == PermissionManager.FLAG_READ) {
edit.setAction(2, new IconDrawable(ComposeActivity.this, MaterialIcons.md_vpn_key), "Request Permission");
} else {
edit.removeAction(2);
}
if ((current & PermissionManager.FLAG_WRITE) == PermissionManager.FLAG_WRITE) {
edit.setAutoCompleteAdapter(contactAdapter);
} else {
edit.setAutoCompleteAdapter(null);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public void acceptSuggestions(String src) {
for (PermissionedTextLayout text : mPermissionedFields.values()) {
text.acceptSuggestions(src);
}
}
public void rejectSuggestions(String src) {
for (PermissionedTextLayout text : mPermissionedFields.values()) {
text.rejectSuggestions(src);
}
}
public void unlink() {
for (PermissionedTextLayout text : mPermissionedFields.values()) {
text.unlink();
}
mMessageRef.child("attachment").removeEventListener(attachmentListener);
mMessageRef.child("group").removeEventListener(groupListener);
if (mPermissionService != null) {
if (mPublicBlessing != null) {
mPublicBlessing.revokePermissions(mPath);
}
//cancel all requests made from this activity
mPermissionManager.cancelRequests(mDeviceId + mId);
}
unbindService(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
unlink();
}
}