text:
package com.easemob.easeui.ui;

import java.io.File;
import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.text.ClipboardManager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.ListView;
import android.widget.Toast;

import com.easemob.EMChatRoomChangeListener;
import com.easemob.EMEventListener;
import com.easemob.EMNotifierEvent;
import com.easemob.EMValueCallBack;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMChatRoom;
import com.easemob.chat.EMConversation;
import com.easemob.chat.EMGroup;
import com.easemob.chat.EMGroupManager;
import com.easemob.chat.EMMessage;
import com.easemob.chat.EMMessage.ChatType;
import com.easemob.chat.ImageMessageBody;
import com.easemob.chat.TextMessageBody;
import com.easemob.easeui.EaseConstant;
import com.easemob.easeui.R;
import com.easemob.easeui.bean.SimiUser;
import com.easemob.easeui.controller.EaseUI;
import com.easemob.easeui.database.DBHelper;
import com.easemob.easeui.utils.EaseCommonUtils;
import com.easemob.easeui.utils.EaseImageUtils;
import com.easemob.easeui.utils.EaseUserUtils;
import com.easemob.easeui.widget.EaseAlertDialog;
import com.easemob.easeui.widget.EaseAlertDialog.AlertDialogUser;
import com.easemob.easeui.widget.EaseChatExtendMenu;
import com.easemob.easeui.widget.EaseChatInputMenu;
import com.easemob.easeui.widget.EaseChatInputMenu.ChatInputMenuListener;
import com.easemob.easeui.widget.EaseChatMessageList;
import com.easemob.easeui.widget.EaseVoiceRecorderView;
import com.easemob.easeui.widget.EaseVoiceRecorderView.EaseVoiceRecorderCallback;
import com.easemob.easeui.widget.chatrow.EaseCustomChatRowProvider;
import com.easemob.util.EMLog;
import com.easemob.util.PathUtil;

/**
 * 可以直接new出来使用的聊天对话页面fragment,
 * 使用时需调用setArguments方法传入chatType(会话类型)和userId(用户或群id)
 * app也可继承此fragment续写
 *

 *

 * 参数传入示例可查看demo里的ChatActivity
 *
 */
public class EaseChatFragment extends EaseBaseFragment implements EMEventListener {
    protected static final String TAG = "EaseChatFragment";
    protected static final int REQUEST_CODE_MAP = 1;
    protected static final int REQUEST_CODE_CAMERA = 2;
    protected static final int REQUEST_CODE_LOCAL = 3;

    /**
     * 传入fragment的参数
     */
    protected Bundle fragmentArgs;
    protected int chatType;
    protected String toChatUsername;
    protected SimiUser simiUser;	//add by garry ,用来在标题显示对方昵称(来自消息列表)
    protected String nickName;//add by garry ,用来在标题显示对方昵称(来自好友信息页面)
    protected EaseChatMessageList messageList;
    protected EaseChatInputMenu inputMenu;

    protected EMConversation conversation;

    protected InputMethodManager inputManager;
    protected ClipboardManager clipboard;

    protected Handler handler = new Handler();
    protected File cameraFile;
    protected EaseVoiceRecorderView voiceRecorderView;
    protected SwipeRefreshLayout swipeRefreshLayout;
    protected ListView listView;

    protected boolean isloading;
    protected boolean haveMoreData = true;
    protected int pagesize = 20;

    protected EMMessage contextMenuMessage;

    static final int ITEM_TAKE_PICTURE = 1;
    static final int ITEM_PICTURE = 2;
    static final int ITEM_LOCATION = 3;

    protected int[] itemStrings = { R.string.attach_take_pic, R.string.attach_picture, R.string.attach_location };
    protected int[] itemdrawables = { R.drawable.ease_chat_takepic_selector, R.drawable.ease_chat_image_selector,
            R.drawable.ease_chat_location_selector };
    protected int[] itemIds = { ITEM_TAKE_PICTURE, ITEM_PICTURE, ITEM_LOCATION };
    private EMChatRoomChangeListener chatRoomChangeListener;
    private boolean isMessageListInited;
    protected MyItemClickListener extendMenuItemClickListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.ease_fragment_chat, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        fragmentArgs = getArguments();
        // 判断单聊还是群聊
        chatType = fragmentArgs.getInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE);
        // 会话人或群组id
        toChatUsername = fragmentArgs.getString(EaseConstant.EXTRA_USER_ID);

        simiUser = DBHelper.getInstance(getActivity()).getSimiUserInfo(getActivity(), toChatUsername);
        nickName = fragmentArgs.getString(EaseConstant.EXTRA_USER_NAME);

        super.onActivityCreated(savedInstanceState);
    }

    /**
     * init view
     */
    @Override
	protected void initView() {
        // 按住说话录音控件
        voiceRecorderView = (EaseVoiceRecorderView) getView().findViewById(R.id.voice_recorder);

        // 消息列表layout
        messageList = (EaseChatMessageList) getView().findViewById(R.id.message_list);
        if(chatType != EaseConstant.CHATTYPE_SINGLE)
            messageList.setShowUserNick(true);
        listView = messageList.getListView();

        extendMenuItemClickListener = new MyItemClickListener();
        inputMenu = (EaseChatInputMenu) getView().findViewById(R.id.input_menu);
        registerExtendMenuItem();
        // 设置按住说话控件
        inputMenu.init();
        inputMenu.setChatInputMenuListener(new ChatInputMenuListener() {

            @Override
            public void onSendMessage(String content) {
                // 发送文本消息
                sendTextMessage(content);
            }

            @Override
            public boolean onPressToSpeakBtnTouch(View v, MotionEvent event) {
                return voiceRecorderView.onPressToSpeakBtnTouch(v, event, new EaseVoiceRecorderCallback() {

                    @Override
                    public void onVoiceRecordComplete(String voiceFilePath, int voiceTimeLength) {
                        // 发送语音消息
                        sendVoiceMessage(voiceFilePath, voiceTimeLength);
                    }
                });
            }
        });

        swipeRefreshLayout = messageList.getSwipeRefreshLayout();
        swipeRefreshLayout.setColorSchemeResources(R.color.holo_blue_bright, R.color.holo_green_light,
                R.color.holo_orange_light, R.color.holo_red_light);

        inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }

    /**
     * 设置属性,监听等
     */
    @Override
	protected void setUpView() {
    	//设置聊天界面标题,显示对方昵称 by garry
    	if(simiUser != null){
    		titleBar.setTitle(simiUser.getName());
    	} else if(nickName != null && nickName.length() > 0){
    		titleBar.setTitle(nickName);
    	} else{
    		titleBar.setTitle(toChatUsername);
    	}

        if (chatType == EaseConstant.CHATTYPE_SINGLE) { // 单聊
            // 设置标题
            if(EaseUserUtils.getUserInfo(toChatUsername) != null){
                titleBar.setTitle(EaseUserUtils.getUserInfo(toChatUsername).getNick());
            }
            titleBar.setRightImageResource(R.drawable.ease_mm_title_remove);
        } else {
//            if (chatType == EaseConstant.CHATTYPE_GROUP) {
//                // 群聊
//                EMGroup group = EMGroupManager.getInstance().getGroup(toChatUsername);
//                if (group != null)
//                    titleBar.setTitle(group.getGroupName());
//                titleBar.setRightImageResource(R.drawable.ease_to_group_details_normal);
//                // 监听当前会话的群聊解散被T事件
//                groupListener = new GroupListener();
//                EMGroupManager.getInstance().addGroupChangeListener(groupListener);
//            } else {
//                onChatRoomViewCreation();
//            }

        }
        if (chatType != EaseConstant.CHATTYPE_CHATROOM) {
            onConversationInit();
            onMessageListInit();
        }

        // 设置标题栏点击事件
        titleBar.setLeftLayoutClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                getActivity().finish();
            }
        });
        titleBar.setRightLayoutClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (chatType == EaseConstant.CHATTYPE_SINGLE) {
                    emptyHistory();
                } else {
                    toGroupDetails();
                }
            }
        });

        setRefreshLayoutListener();

        // show forward message if the message is not null
        String forward_msg_id = getArguments().getString("forward_msg_id");
        if (forward_msg_id != null) {
            // 发送要转发的消息
            forwardMessage(forward_msg_id);
        }
    }

    /**
     * 注册底部菜单扩展栏item; 覆盖此方法时如果不覆盖已有item,item的id需大于3
     */
    protected void registerExtendMenuItem(){
        for(int i = 0; i < itemStrings.length; i++){
            inputMenu.registerExtendMenuItem(itemStrings[i], itemdrawables[i], itemIds[i], extendMenuItemClickListener);
        }
    }

    protected void onConversationInit(){
        // 获取当前conversation对象
        conversation = EMChatManager.getInstance().getConversation(toChatUsername);
        // 把此会话的未读数置为0
        conversation.markAllMessagesAsRead();
        // 初始化db时,每个conversation加载数目是getChatOptions().getNumberOfMessagesLoaded
        // 这个数目如果比用户期望进入会话界面时显示的个数不一样,就多加载一些
        final List<EMMessage> msgs = conversation.getAllMessages();
        int msgCount = msgs != null ? msgs.size() : 0;
        if (msgCount < conversation.getAllMsgCount() && msgCount < pagesize) {
            String msgId = null;
            if (msgs != null && msgs.size() > 0) {
                msgId = msgs.get(0).getMsgId();
            }
            if (chatType == EaseConstant.CHATTYPE_SINGLE) {
                conversation.loadMoreMsgFromDB(msgId, pagesize - msgCount);
            } else {
                conversation.loadMoreGroupMsgFromDB(msgId, pagesize - msgCount);
            }
        }

    }

    protected void onMessageListInit(){
        messageList.init(toChatUsername, chatType, chatFragmentListener != null ?
                chatFragmentListener.onSetCustomChatRowProvider() : null);
        //设置list item里的控件的点击事件
        setListItemClickListener();

        messageList.getListView().setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                hideKeyboard();
                inputMenu.hideExtendMenuContainer();
                return false;
            }
        });

        isMessageListInited = true;
    }

    protected void setListItemClickListener() {
        messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() {

            @Override
            public void onUserAvatarClick(String username) {
                if(chatFragmentListener != null){
                    chatFragmentListener.onAvatarClick(username);
                }
            }

            @Override
            public void onResendClick(final EMMessage message) {
                new EaseAlertDialog(getActivity(), R.string.resend, R.string.confirm_resend, null, new AlertDialogUser() {
                    @Override
                    public void onResult(boolean confirmed, Bundle bundle) {
                        if (!confirmed) {
                            return;
                        }
                        resendMessage(message);
                    }
                }, true).show();
            }

            @Override
            public void onBubbleLongClick(EMMessage message) {
                contextMenuMessage = message;
                if(chatFragmentListener != null){
                    chatFragmentListener.onMessageBubbleLongClick(message);
                }
            }

            @Override
            public boolean onBubbleClick(EMMessage message) {
                if(chatFragmentListener != null){
                    return chatFragmentListener.onMessageBubbleClick(message);
                }
                return false;
            }
        });
    }

    protected void setRefreshLayoutListener() {
        swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() {

            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        if (listView.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) {
                            List<EMMessage> messages;
                            try {
                                if (chatType == EaseConstant.CHATTYPE_SINGLE) {
                                    messages = conversation.loadMoreMsgFromDB(messageList.getItem(0).getMsgId(),
                                            pagesize);
                                } else {
                                    messages = conversation.loadMoreGroupMsgFromDB(messageList.getItem(0).getMsgId(),
                                            pagesize);
                                }
                            } catch (Exception e1) {
                                swipeRefreshLayout.setRefreshing(false);
                                return;
                            }
                            if (messages.size() > 0) {
                                messageList.refreshSeekTo(messages.size() - 1);
                                if (messages.size() != pagesize) {
                                    haveMoreData = false;
                                }
                            } else {
                                haveMoreData = false;
                            }

                            isloading = false;

                        } else {
                            Toast.makeText(getActivity(), getResources().getString(R.string.no_more_messages),
                                    Toast.LENGTH_SHORT).show();
                        }
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 600);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == REQUEST_CODE_CAMERA) { // 发送照片
                if (cameraFile != null && cameraFile.exists())
                    sendImageMessage(cameraFile.getAbsolutePath());
            } else if (requestCode == REQUEST_CODE_LOCAL) { // 发送本地图片
                if (data != null) {
                    Uri selectedImage = data.getData();
                    if (selectedImage != null) {
                        sendPicByUri(selectedImage);
                    }
                }
            } else if (requestCode == REQUEST_CODE_MAP) { // 地图
                double latitude = data.getDoubleExtra("latitude", 0);
                double longitude = data.getDoubleExtra("longitude", 0);
                String locationAddress = data.getStringExtra("address");
                if (locationAddress != null && !locationAddress.equals("")) {
                    sendLocationMessage(latitude, longitude, locationAddress);
                } else {
                    Toast.makeText(getActivity(), R.string.unable_to_get_loaction, 0).show();
                }

            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(isMessageListInited)
            messageList.refresh();
        EaseUI.getInstance().pushActivity(getActivity());
        // register the event listener when enter the foreground
        EMChatManager.getInstance().registerEventListener(
                this,
                new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewMessage,
                        EMNotifierEvent.Event.EventOfflineMessage, EMNotifierEvent.Event.EventDeliveryAck,
                        EMNotifierEvent.Event.EventReadAck });
    }

    @Override
    public void onStop() {
        super.onStop();
        // unregister this event listener when this activity enters the
        // background
        EMChatManager.getInstance().unregisterEventListener(this);
        if(chatRoomChangeListener != null)
            EMChatManager.getInstance().removeChatRoomChangeListener(chatRoomChangeListener);

        // 把此activity 从foreground activity 列表里移除
        EaseUI.getInstance().popActivity(getActivity());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        if(chatType == EaseConstant.CHATTYPE_CHATROOM){
            EMChatManager.getInstance().leaveChatRoom(toChatUsername);
        }
    }

    /**
     * 事件监听,registerEventListener后的回调事件
     *
     * see {@link EMNotifierEvent}
     */
    @Override
    public void onEvent(EMNotifierEvent event) {
        switch (event.getEvent()) {
        case EventNewMessage:
            // 获取到message
            EMMessage message = (EMMessage) event.getData();

            String username = null;
            // 群组消息
            if (message.getChatType() == ChatType.GroupChat || message.getChatType() == ChatType.ChatRoom) {
                username = message.getTo();
            } else {
                // 单聊消息
                username = message.getFrom();
            }

            // 如果是当前会话的消息,刷新聊天页面
            if (username.equals(toChatUsername)) {
                messageList.refreshSelectLast();
                // 声音和震动提示有新消息
                EaseUI.getInstance().getNotifier().viberateAndPlayTone(message);
            } else {
                // 如果消息不是和当前聊天ID的消息
                EaseUI.getInstance().getNotifier().onNewMsg(message);
            }

            break;
        case EventDeliveryAck:
        case EventReadAck:
            // 获取到message
            messageList.refresh();
            break;
        case EventOfflineMessage:
            // a list of offline messages
            // List<EMMessage> offlineMessages = (List<EMMessage>)
            // event.getData();
            messageList.refresh();
            break;
        default:
            break;
        }

    }

    public void onBackPressed() {
        if (inputMenu.onBackPressed()) {
            getActivity().finish();
            if (chatType == EaseConstant.CHATTYPE_CHATROOM) {
                EMChatManager.getInstance().leaveChatRoom(toChatUsername);
            }
        }
    }

    protected void onChatRoomViewCreation() {
        final ProgressDialog pd = ProgressDialog.show(getActivity(), "", "Joining......");
        EMChatManager.getInstance().joinChatRoom(toChatUsername, new EMValueCallBack<EMChatRoom>() {

            @Override
            public void onSuccess(final EMChatRoom value) {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(getActivity().isFinishing() || !toChatUsername.equals(value.getUsername()))
                            return;
                        pd.dismiss();
                        EMChatRoom room = EMChatManager.getInstance().getChatRoom(toChatUsername);
                        if (room != null) {
                            titleBar.setTitle(room.getName());
                        } else {
                        	// modify by garry
                        	if(simiUser != null){
                        		titleBar.setTitle(simiUser.getName());
                        	} else if(nickName != null && nickName.length() > 0){
                        		titleBar.setTitle(nickName);
                        	} else{
                        		titleBar.setTitle(toChatUsername);
                        	}
                        }
                        EMLog.d(TAG, "join room success : " + room.getName());
                        addChatRoomChangeListenr();
                        onConversationInit();
                        onMessageListInit();
                    }
                });
            }

            @Override
            public void onError(final int error, String errorMsg) {
                // TODO Auto-generated method stub
                EMLog.d(TAG, "join room failure : " + error);
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        pd.dismiss();
                    }
                });
                getActivity().finish();
            }
        });
    }

    protected void addChatRoomChangeListenr() {
        chatRoomChangeListener = new EMChatRoomChangeListener() {

            @Override
            public void onChatRoomDestroyed(String roomId, String roomName) {
                if (roomId.equals(toChatUsername)) {
                    showChatroomToast(" room : " + roomId + " with room name : " + roomName + " was destroyed");
                    getActivity().finish();
                }
            }

            @Override
            public void onMemberJoined(String roomId, String participant) {
                showChatroomToast("member : " + participant + " join the room : " + roomId);
            }

            @Override
            public void onMemberExited(String roomId, String roomName, String participant) {
                showChatroomToast("member : " + participant + " leave the room : " + roomId + " room name : " + roomName);
            }

            @Override
            public void onMemberKicked(String roomId, String roomName, String participant) {
                if (roomId.equals(toChatUsername)) {
                    String curUser = EMChatManager.getInstance().getCurrentUser();
                    if (curUser.equals(participant)) {
                        EMChatManager.getInstance().leaveChatRoom(toChatUsername);
                        getActivity().finish();
                    }else{
                        showChatroomToast("member : " + participant + " was kicked from the room : " + roomId + " room name : " + roomName);
                    }
                }
            }

        };

        EMChatManager.getInstance().addChatRoomChangeListener(chatRoomChangeListener);
    }

    protected void showChatroomToast(final String toastContent){
        getActivity().runOnUiThread(new Runnable() {
            @Override
			public void run() {
                Toast.makeText(getActivity(), toastContent, Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 扩展菜单栏item点击事件
     *
     */
    class MyItemClickListener implements EaseChatExtendMenu.EaseChatExtendMenuItemClickListener{

        @Override
        public void onClick(int itemId, View view) {
            if(chatFragmentListener != null){
                if(chatFragmentListener.onExtendMenuItemClick(itemId, view)){
                    return;
                }
            }
            switch (itemId) {
            case ITEM_TAKE_PICTURE: // 拍照
                selectPicFromCamera();
                break;
            case ITEM_PICTURE:
                selectPicFromLocal(); // 图库选择图片
                break;
            case ITEM_LOCATION: // 位置
                startActivityForResult(new Intent(getActivity(), EaseBaiduMapActivity.class), REQUEST_CODE_MAP);
                break;

            default:
                break;
            }
        }

    }

    //发送消息方法
    //==========================================================================
    protected void sendTextMessage(String content) {
        EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername);
        sendMessage(message);
    }

    protected void sendVoiceMessage(String filePath, int length) {
        EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername);
        sendMessage(message);
    }

    protected void sendImageMessage(String imagePath) {
        EMMessage message = EMMessage.createImageSendMessage(imagePath, false, toChatUsername);
        sendMessage(message);
    }

    protected void sendLocationMessage(double latitude, double longitude, String locationAddress) {
        EMMessage message = EMMessage.createLocationSendMessage(latitude, longitude, locationAddress, toChatUsername);
        sendMessage(message);
    }

    protected void sendVideoMessage(String videoPath, String thumbPath, int videoLength) {
        EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername);
        sendMessage(message);
    }

    protected void sendFileMessage(String filePath) {
        EMMessage message = EMMessage.createFileSendMessage(filePath, toChatUsername);
        sendMessage(message);
    }

    protected void sendMessage(EMMessage message){
        if(chatFragmentListener != null){
            //设置扩展属性
            chatFragmentListener.onSetMessageAttributes(message);
        }
        // 如果是群聊,设置chattype,默认是单聊
        if (chatType == EaseConstant.CHATTYPE_GROUP){
            message.setChatType(ChatType.GroupChat);
        }else if(chatType == EaseConstant.CHATTYPE_CHATROOM){
            message.setChatType(ChatType.ChatRoom);
        }
        //发送消息
        EMChatManager.getInstance().sendMessage(message, null);
        //刷新ui
        messageList.refreshSelectLast();
    }

    public void resendMessage(EMMessage message){
        message.status = EMMessage.Status.CREATE;
        EMChatManager.getInstance().sendMessage(message, null);
        messageList.refresh();
    }

    //===================================================================================

    /**
     * 根据图库图片uri发送图片
     *
     * @param selectedImage
     */
    protected void sendPicByUri(Uri selectedImage) {
        String[] filePathColumn = { MediaColumns.DATA };
        Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            cursor = null;

            if (picturePath == null || picturePath.equals("null")) {
                Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;
            }
            sendImageMessage(picturePath);
        } else {
            File file = new File(selectedImage.getPath());
            if (!file.exists()) {
                Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;

            }
            sendImageMessage(file.getAbsolutePath());
        }

    }

    /**
     * 根据uri发送文件
     * @param uri
     */
    protected void sendFileByUri(Uri uri){
        String filePath = null;
        if ("content".equalsIgnoreCase(uri.getScheme())) {
            String[] filePathColumn = { MediaColumns.DATA };
            Cursor cursor = null;

            try {
                cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow("_data");
                if (cursor.moveToFirst()) {
                    filePath = cursor.getString(column_index);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            filePath = uri.getPath();
        }
        File file = new File(filePath);
        if (file == null || !file.exists()) {
            Toast.makeText(getActivity(), R.string.File_does_not_exist, 0).show();
            return;
        }
        //大于10M不让发送
        if (file.length() > 10 * 1024 * 1024) {
            Toast.makeText(getActivity(), R.string.The_file_is_not_greater_than_10_m, 0).show();
            return;
        }
        sendFileMessage(filePath);
    }

    /**
     * 照相获取图片
     */
    protected void selectPicFromCamera() {
        if (!EaseCommonUtils.isExitsSdcard()) {
            Toast.makeText(getActivity(), R.string.sd_card_does_not_exist, 0).show();
            return;
        }

        cameraFile = new File(PathUtil.getInstance().getImagePath(), EMChatManager.getInstance().getCurrentUser()
                + System.currentTimeMillis() + ".jpg");
        cameraFile.getParentFile().mkdirs();
        startActivityForResult(
                new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)),
                REQUEST_CODE_CAMERA);
    }

    /**
     * 从图库获取图片
     */
    protected void selectPicFromLocal() {
        Intent intent;
        if (Build.VERSION.SDK_INT < 19) {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");

        } else {
            intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        }
        startActivityForResult(intent, REQUEST_CODE_LOCAL);
    }

    /**
     * 点击清空聊天记录
     *
     */
    protected void emptyHistory() {
        String msg = getResources().getString(R.string.Whether_to_empty_all_chats);
        new EaseAlertDialog(getActivity(),null, msg, null,new AlertDialogUser() {

            @Override
            public void onResult(boolean confirmed, Bundle bundle) {
                if(confirmed){
                    // 清空会话
                    EMChatManager.getInstance().clearConversation(toChatUsername);
                    messageList.refresh();
                }
            }
        }, true).show();;
    }

    /**
     * 点击进入群组详情
     *
     */
    protected void toGroupDetails() {
        if (chatType == EaseConstant.CHATTYPE_GROUP) {
            EMGroup group = EMGroupManager.getInstance().getGroup(toChatUsername);
            if (group == null) {
                Toast.makeText(getActivity(), R.string.gorup_not_found, 0).show();
                return;
            }
            if(chatFragmentListener != null){
                chatFragmentListener.onEnterToChatDetails();
            }
        }
    }

    /**
     * 隐藏软键盘
     */
    protected void hideKeyboard() {
        if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
            if (getActivity().getCurrentFocus() != null)
                inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    /**
     * 转发消息
     *
     * @param forward_msg_id
     */
    protected void forwardMessage(String forward_msg_id) {
        final EMMessage forward_msg = EMChatManager.getInstance().getMessage(forward_msg_id);
        EMMessage.Type type = forward_msg.getType();
        switch (type) {
        case TXT:
            // 获取消息内容,发送消息
            String content = ((TextMessageBody) forward_msg.getBody()).getMessage();
            sendTextMessage(content);
            break;
        case IMAGE:
            // 发送图片
            String filePath = ((ImageMessageBody) forward_msg.getBody()).getLocalUrl();
            if (filePath != null) {
                File file = new File(filePath);
                if (!file.exists()) {
                    // 不存在大图发送缩略图
                    filePath = EaseImageUtils.getThumbnailImagePath(filePath);
                }
                sendImageMessage(filePath);
            }
            break;
        default:
            break;
        }

        if(forward_msg.getChatType() == EMMessage.ChatType.ChatRoom){
            EMChatManager.getInstance().leaveChatRoom(forward_msg.getTo());
        }
    }

    /**
     * 监测群组解散或者被T事件
     *
     */
    class GroupListener extends EaseGroupRemoveListener {

        @Override
        public void onUserRemoved(final String groupId, String groupName) {
            getActivity().runOnUiThread(new Runnable() {

                @Override
				public void run() {
                    if (toChatUsername.equals(groupId)) {
                        Toast.makeText(getActivity(), R.string.you_are_group, 1).show();
                        getActivity().finish();
                    }
                }
            });
        }

        @Override
        public void onGroupDestroy(final String groupId, String groupName) {
            // 群组解散正好在此页面,提示群组被解散,并finish此页面
            getActivity().runOnUiThread(new Runnable() {
                @Override
				public void run() {
                    if (toChatUsername.equals(groupId)) {
                        Toast.makeText(getActivity(), R.string.the_current_group, 1).show();
                        getActivity().finish();
                    }
                }
            });
        }

    }

    protected EaseChatFragmentListener chatFragmentListener;
    public void setChatFragmentListener(EaseChatFragmentListener chatFragmentListener){
        this.chatFragmentListener = chatFragmentListener;
    }

    public interface EaseChatFragmentListener{
        /**
         * 设置消息扩展属性
         */
        void onSetMessageAttributes(EMMessage message);

        /**
         * 进入会话详情
         */
        void onEnterToChatDetails();

        /**
         * 用户头像点击事件
         * @param username
         */
        void onAvatarClick(String username);

        /**
         * 消息气泡框点击事件
         */
        boolean onMessageBubbleClick(EMMessage message);

        /**
         * 消息气泡框长按事件
         */
        void onMessageBubbleLongClick(EMMessage message);

        /**
         * 扩展输入栏item点击事件,如果要覆盖EaseChatFragment已有的点击事件,return true
         * @param view
         * @param itemId
         * @return
         */
        boolean onExtendMenuItemClick(int itemId, View view);

        /**
         * 设置自定义chatrow提供者
         * @return
         */
        EaseCustomChatRowProvider onSetCustomChatRowProvider();
    }

}

redpajama_set_name: RedPajamaGithub


text:
Audio from Guantanamo Remembered: 10 Years meeting
ftp | 11.01.2012 21:52 | Guantánamo | Anti-militarism | World
This audio was recorded at the 10th Anniversary remembrance, in honour of those still incarcerated at Guantanamo. The meeting was jointly organised by Cage Prisoners, Reprieve and the Islamic Human Rights Commission.
The meeting in London's Conway Hall began with a recording of a song and a live chant from the Koran, both by former detainees. The meeting and speakers were introduced by Victoria Britain.
Introduction - mp3 8.7M
Homepage: https://www.cageprisoners.com/our-work/events/item/3001-guantanamo-remembered-10-years
Moazzam Begg Audio
Download: Moazzam Begg - mp3 11M
Moazzam Begg, Director of Cage Prisoners, and former Guantanamo detainee addresses the Remebering Guantanamo: 10 years meeting. Introduction by Victoria Britain
Michael Ratner
Download: Michael Ratner - mp3 11M
Attorney Michael Ratner, President of the Center for Constitutional Rights in the USA addresses the Guantanamo Remembered: 10 Years meeting at London's Conway Hall on Wednesday, 11/01/12.
Vanessa Redgrave reads Murat Kurnaz
Download: Vanessa Redgrave reads Murat Kurnaz - mp3 5.8M
Murat Kurnaz, a former detainee was unable to attend the meeting. Vanessa Redgrave read an edited version of an article of his which appeared in the NY Times on 07/01/12.
Gareth Peirce
Download: Gareth Peirce - mp3 8.3M
LawyerGareth Peirce addresses the Guantanamo Remembered: 10 Years meeting at London's Conway Hall on 11/01/12
Sami al-Hajj
Download: Sami al-Hajj - mp3 6.3M
Former detainee, Al Jazeera journalist Sami al-Hajj addresses the 'Guantanamo Remembered: 10 Years' meeting at London's Conway Hall. Translated by Moazzam Begg and introduced by Victoria Britain
Clive Stafford Smith
Download: Clive Stafford Smith - mp3 21M
Clive Stafford Smith, Death Row lawyer and founder of Reprieve addresses the 'Guantanamo Rememebered: 10 Years' meeting at London's Conway Hall on 11/1/12. Introduction (including reading of letter from British resident Shaker Aamer to his wife, by Victoria Britain.
Omar Deghayes
Download: Omar Deghayes - mp3 2.1M
Former detainee Omar Deghayes addresses the 'Guantanamo Remembered: 10 Years' meeting in London on 11/1/12
Massoud Shadjareh
Download: Massoud Shadjareh - mp3 8.5M
Massoud Shadjareh, chair of the Islamic Human Rights Commission, one of the groups sponsoring the meeting, addresses the 'Guantanamo Remembered: 10 Years' meeting in London on 11/1/12.
Three poems brought out of Guantanamo
Download: Three poems brought out of Guantanamo - mp3 4.2M
The meeting concluded with a reading of 3 poems by detainees, which were brought of Guantanamo by lawyers and translated into English.

redpajama_set_name: RedPajamaCommonCrawl


Interesting argument, but seems pretty obviously wrong.
I'm quoted in this article complaining about all the thugs and assholes in the hacker community. The way the article quotes it makes it sound like that's my opinion as a sociologist. It isn't. But I do feel that way.
I don't actually buy this argument. It's got a sort of "back in the good old days" that I suppose has more to do with the author's own experience than with any object difference in the way technology is designed. That said, there's a good point in here and the intentions are admirable.


text:
Thematic Reviews: driving change in the WASH sector through reflection and learning
Marianne Kristensen
Monitoring, accountability and governance Sector strengthening
How can we make water, sanitation and hygiene services sustainable (and does our approach work)? WaterAid commissioned an external evaluation of a Sector Strengthening approach to sustainable services. PMER Advisor Marianne Kristensen discusses the results of the evaluation.
At WaterAid we support governments and service providers in strengthening the systems and capabilities needed to deliver sustainable water, sanitation and hygiene (WASH) services.
While this is not a new approach for us, it has been driven forward with renewed energy under our 2015 Global Strategy as a response to the ambitious Sustainable Development Goal (SDG) targets. We recognise that a step change in behaviours and ways of working in the WASH sector is necessary to accelerate progress towards reaching everyone, everywhere by 2030:
The evidence from countries that do best in delivering rapid improvements in sustainable WASH services is that having robust policies, coordinated institutions, strong leadership and, above all, effective performance monitoring systems is vital. So, building integrated and effective programming and advocacy work that aims to strengthen those capabilities is central to WaterAid realising its mission to achieve universal access to sustainable WASH services (Henry Northover, Global Policy Director, WaterAid).
Achieving this step change while improving the way we work together is essential if we are to meet the ambitious SDG 6 targets within 12 years. Civil society organisations need to test and evaluate new approaches and ways of working with government and service providers.
To this end, WaterAid commissioned an external evaluation (January to June 2018) to assess how our approach to Sector Strengthening for Sustainable Services is understood and put into practice by WaterAid's Country Programmes, and identify the key enablers and barriers.
The evaluation found that WaterAid's "approach is relevant to addressing WASH sector issues at global, national and local levels and is an appropriate response to meet the goal of universal WASH access by 2030". A number of our Country Programmes are showing promising results by demonstrating effective service delivery models with government partners while strengthening key building blocks as a means for government authorities to manage existing and further expand service delivery through better policies and procedures. For example:
WaterAid Ethiopia's focus on strengthening municipal WASH service delivery by developing human, system and resource capacities of municipal utilities has secured both buy-in and financial commitments from two regional governments interested in scaling up the capacity development approach used.
WaterAid Nicaragua is establishing a national SMART WASH Centre to showcase appropriate and affordable technologies (particularly targeting isolated, remote and dispersed populations), supported by a comprehensive capacity development package to promote a life-cycle approach to construction and implementation.
WaterAid Malawi's support to private waste and water service providers is ensuring their legalisation and regulations as well as showing signs of improving their cost recovery and financial sustainability.
While these examples demonstrate both sustainability and scalability, the evaluation also provided a number of concrete recommendations on how we can further improve our work. These include:
Clearly defining and framing our approach to ensure that supporting governments and service providers to strengthen their systems and capabilities is embedded in everything we do across all WaterAid Country Programmes. This was identified as particularly important to ensure that our programming and projects are designed with this at the core.
Continuing to influence donors and international stakeholders to provide funding to strengthening systems and capacities instead of solely focusing on service provision numbers
Strengthening our internal capacity and identifying external capacity support in all aspects of the systems and capacity needed to support governments and service providers.
Read the full report >
Now that we have identified areas for improvement, it is time to act. We are committed to addressing the recommendations through a set of clearly defined actions, so that we can play our role in supporting governments and service providers to strengthen the systems and capabilities required to deliver sustainable WASH services to communities across the world.
But we cannot do it alone. Building an effective WASH sector requires all stakeholders to cooperate in support of a government-led accelerated plan. The plans themselves need to be based on strong inter-sectoral coordination and stable, well-financed institutions with strong regulations and performance monitoring, in order to foster a culture of flexibility, learning and adaption.
Unfortunately, current incentives by donors and governments that prioritise numerical outputs do not always encourage such ways of working. However, by defining and adopting more effective behaviours as part of a mutual commitment to sector strengthening, and ensuring these are reflected in funding and programming decisions, governments and development partners can together realise the ambition of the SDGs.
Marianne Kristensen is PMER Advisor on International Programmes at WaterAid.
How to navigate complex development environments with adaptive programming
Adebayo Alao and John Garrett
How can Nigeria fill the funding gap to address its state of WASH emergency?
Megan Wilson-Jones
What does evidence on nutrition and water, sanitation and hygiene mean for programming and policy?
Andrés Hueso
We must all stand up for the human rights of sanitation workers


As an economist I am often amazed at how many people spout nonsense about economics, often misquoting something Adam Smith supposedly said, but who haven't actually read anything he wrote. The same can be said about the Bible, which people love to talk about even if they haven't actually read it. Readers of this site know that I am a regular critic of religion, but I have read the Bible (as well as many other major religious texts, including the Koran, the Upanishads, and various Buddhist Sutras), and I recently decided to read it again. With both this week's celebration and condemnation of the anniversary of Roe v. Wade, I wanted to understand more precisely what Christians are referring to when they mention the "culture of life" that the Bible inspires them to establish in society.
What I discovered may surprise you (or maybe not).
Most of the Bible describes an intensely violent and vengeful Creator who routinely murders huge swaths of humanity, many of them innocent children (ones outside of the womb). This Creator adheres to a sense of justice that is often seemingly arbitrary (which is by definition unjust) and disproportionate. And no, this isn't just in the Old Testament. Jesus says specifically that he has come to "bring the sword" and speaks repeatedly about the wrath God is going to unleash on the world in no uncertain terms, and doesn't seem to be bothered by this (despite the fact that in other passages he preaches peace). The final chapter of the New Testament, Revelation, describes the coming apocalypse in graphic detail, culminating in the final cleansing of the earth in which only 144,000 are going to be left standing. If we take the present population as a guide that's six billion dead, and we're not talking peaceful death in your sleep.
The bottom line: the God of the Bible does not treat people as precious miracles that must be preserved at all cost, but instead as easily dispensable vessels that can be disposed of at will by horrific means if they upset "Him." The obsession with the "sanctity of life" (which is in many ways a good obsession) that is expressed so often within the Christian community has little basis in what is actually written in the book from which they draw their inspiration (a rough unscientific estimate is that less than 1% of the Bible espouses such a view).
What I am saying is certain to upset some religious people, but facts are facts; this is what the Bible says. Certainly, some people may argue that I am taking the text too literally (something people like me often criticize religious people for), but what I have described is repeated so many times and in such explicit language throughout the text that there is no other way to interpret it without rendering the Bible ultimately meaningless; after all, if this isn't really how we are supposed to believe God acts why mention it hundreds of times in gruesome detail?
If we want to create a larger "culture of life" (which is a noble goal and hopefully would include more than just humans), we are going to need more than Bible and the Christian religion to do it. I am not claiming that there aren't isolated passages of the Bible that could be used to promote the sanctity of life, only that the overall thrust of the text portrays God as a deity who does not treat each individual as sacred. In fact, the ease with which the God of the Bible kills people and their innocent offspring is inconsistent with the dominant sense of morality almost all people share and strive for these days.
Future posts will be dedicated to suggesting alternative frameworks that might do a better job of establishing the moral framework for a "culture of life," which I believe should extend to non-humans. In the meantime, I'm curious what you all think, both the religious and non-religious.
As a side note, on the blog "www.freerepublic.com" (a GOP-friendly website) I pointed out a couple of these uncomfortable facts about the Bible in a low-key way (no profanity, no name calling, and prefaced by saying that I didn't want to offend anybody) since I wanted a response from religious Republicans. I think this is a serious issue given that "moral values" and the role of (Christian) religion in society are such major topics these days. What did I get? My posting privileges were immediately revoked from the site. I guess freedom for these Republicans only means the freedom to echo the party line. What a shame, but unfortunately, not surprising and very in line with the way the Bush administration conducts its affairs.


Comfortably numb is a single level canalfront home located in the exclusive gated community of Lyford Cay. The lot is 0.65 with 160 feet of canal frontage with a deep water dock that can accommodate an 80 foot yacht. The main home has 3 bedrooms and 3 and a half bathrooms plus a separate 1 bedroom 1 bathroom poolside cottage. The spacious open plan living area includes the kitchen with a breakfast nook, living area and formal dining room have high ceilings plus there is a separate T.V. room. The western wing of the house encompasses the bedrooms plus a study. The master suite has a walk in closet patio doors leading to the gardens. The house features a pool with Jacuzzi and gazebo, travertine tiling throughout, durable aluminum roof, hurricane impact windows and doors, 2 car garage, laundry room and plenty of storage.


text:
CelebrityWShow
Yankees' Luis Severino Is Out Until May; Aaron Hicks Could Miss Opening Day
TAMPA, Fla. — Two key Yankees may be out longer than originally expected to start the 2019 season.
While pitcher Luis Severino had already been scratched from his opening day start on March 28 because of a shoulder injury, General Manager Brian Cashman gave a clearer estimate on Friday, saying Severino would be out until the beginning of May "at the very earliest."
"I can't tell you past that," he added. "If it needs to be more, we need to make sure we don't have a problem with it."
Aaron Hicks, who has been dealing with a back injury, may not be available for opening day, either. Cashman said the Yankees had yet to determine if the center fielder would be available for their first game, against the Baltimore Orioles, but he admitted the team had begun considering how to juggle the roster if Hicks was not ready.
When Hicks's back stiffness first emerged two weeks ago, the Yankees believed it would be resolved in a few days. The discomfort persisted, however, to the point that Hicks received a cortisone shot in his back on Monday.
Cashman said Hicks, 29, could see a stint, if needed, on the 10-day injured list.
"We're running out of time," Cashman said. "We're going to do what's right for us in the long haul."
Hicks said on Friday that his back felt "great," but he was doing only conditioning exercises and had not yet resumed hitting. "If I keep staying pretty stable, I'm not too worried about it," he said.
Whenever his back is ready for hitting, Hicks said it would not take him long — 15 to 20 at-bats, he estimated — to regain his timing for the season. Hicks, who received a seven-year, $70 million contract extension last month, made clear he wanted to be on the field against the Orioles on the 28th.
"You want to feel that rush of opening day, and you want to be introduced with your team," he said.
If Hicks is on the injured list to start the season, the Yankees will use Brett Gardner in center field, with Giancarlo Stanton and Aaron Judge on each side. The ripple effects on the rest of the roster are also yet to be determined: Who would be the fourth outfielder? Would the team carry both Luke Voit and Greg Bird at first base?
Severino, 25, who signed a four-year, $40 million contract extension last month, received a cortisone shot for his right rotator cuff inflammation and still has several days remaining in his 14-day shutdown from throwing. He will start playing catch next week, and if he encounters no issues it will still take at least a month to rebuild his arm strength and stamina to the point where he can return to a major league game.
Severino, who will be replaced by Masahiro Tanaka for the start on opening day, said he understood the reasoning for his being held out for all of April. "I just want to be healthy and help my team," he said.
Cashman said the Yankees expected starting pitcher C.C. Sabathia, whose spring training has been hampered by off-season surgeries on his heart and right knee, to be ready "at some point in April." Sabathia, who may appear in his first spring training game next week, also must serve a five-game suspension to start the season stemming from an incident in which he threw at Tampa Bay's Jesus Sucre in a game last fall.
Cashman insisted he was pleased with the team's internal candidates — Luis Cessa, Domingo German and Jonathan Loaisiga — to fill the rotation spots until Severino and Sabathia are back. But he wouldn't rule out other options.
"Doesn't mean we're not opposed to outside opportunities," he added, "if those opportunities match up with our interest level."
The Yankees Trade Sonny Gray to the Reds for a Pick and a Prospect
Mets sign Rajai Davis to add speed and outfield depth
Manny Machado has to decide how much he'll sacrifice to sign with Yankees
Manny Machado, Bryce Harper are staring at same money decision
Deep in Winter, Let's Discuss the Stifling of Starting Pitchers
Tags Baseball Sports injury Yankees
Protests in Brazil after councilwoman Franco was shot dead
May's Brexit deal lives: Northern Irish kingmakers report 'good' talks with government
Children ran crying and screaming after 'bullied' schoolboy, 14, lay on tracks and was hit by train in front of them
SOBBING children ran screaming "I saw it, I saw it" moments after a 14-year-old boy lay on tracks in front...
Up to 50 schoolchildren watched as boy was hit by train
Five-week Universal Credit wait is 'really hard' on pressed Brits, Amber Rudd admits as she pushes next PM to kill it off – The Sun
Angry passengers turn on unions as millions face check-in chaos
'I feel like I'm in control of my career again': Em Rusciano brings rage to stage
Killer convicted of murdering ex as she went to collect her kids from school
Locarno: Charades Acquires Competition Contender 'Maternal' (EXCLUSIVE)
Sex talk on the 'The Bachelorette' triggers heated conversation The popular ABC show's star, Hannah Brown, made a remark about...
Key differences in Brad Pitt's marriages to Jennifer Aniston and Angelina Jolie
'AGT' 2019 Spoilers: Seven Acts Advance, 11 Acts Eliminated in First Judge Cuts Episode
K-Pop Star Jackson Surprises Fans With Hot Shirtless Bottle Cap Challenge Video – Watch!
Sarah Hyland & Wells Adams Are Engaged After 2 Years Of Dating — Watch Him Propose
Copyright © All rights reserved. 2019 CelebrityWShow.


Choose from adult only or family friendly resorts. All offer luxurious rooms, beautiful beaches and all inclusive gourmet dining.
Totem Travel has three El Dorado and Azul Resort specialists and we've been to all six of these exceptional all inclusive resorts recently. As specialists we have many "extras" to offer our clients such as complimentary room upgrades, private dinners or a massage for two. We'll help you "Enter to Win" a 3 night all inclusive vacation and can provide tips and suggestions to take advantage of all the current specials.
The El Dorado and Azul Resorts have branded themselves "Gourmet All Inclusive" resorts. Unlike many other all inclusive resorts in Mexico there are no buffets to be found, no restaurant reservations are required and most resort guests can enjoy 24 hour a day room service. The quality of food and beverage service is high and there are many luxury features such as beach beds, beach butlers, swim up pool bars, in room jacuzzis, outdoor showers and suites with private pools. There are even villas with 3 bedrooms, a gourmet kitchen and gorgeous oceanfront patio with BBQ for a larger family vacation or group of friends.
El Dorado Resorts are for adults only and with one exception, guests must be 18 or older. This makes El Dorado Royale and Casitas Royale, El Dorado Maroma and El Dorado Seaside Suites an excellent choice for a honeymoon, romantic getaway or destination wedding! Two of the El Dorado Resorts have oceanfront chapels and all offer destination weddings and free wedding packages with a minimum number of rooms.
By contrast, the Azul Resorts focus on family vacations and have exceptional kids clubs, accommodations and facilities for families with infants, young children or active teenagers.
El Dorado Royale and Casitas Royale – is an adult only all inclusive resort located in Riviera Maya, south of Cancun on the Yucatan peninsula of Mexico. The resort has been voted among the world's top 100 hotels by readers of Conde Nast Traveler and it's no wonder. The property is beautiful, the rooms are luxurious, the food is excellent and the service superb!
Accommodations range from a Jacuzzi Junior Suite to Presidential Casitas but every suite, regardless of category, comes with a private Jacuzzi tub, 4 poster bed and large terraces or balconies with hammocks. Swim-up suites add the luxury of stepling off your private patio into a lazy river, which meanders around the garden villas to the beachside pool and 9 swim-up bars.
The Casitas are in a separate, secluded area of the resort directly on the beach. Here you'll find romantic extras like beach beds, reserved just for casitas guests and beach butlers offering drinks, snacks, a facial spritz, and magazines. Beachside pools surround the Casita Suites.
The casitas have high ceilings, a palapa roof, aromatherapy and pillow menus. All casita suites have oversized balconies with linen curtains for privacy and a concierge is available to bring you champagne at midnight, or a sunrise breakfast on your terrace.
The Infinity Pool Casita Suites are on the second story and have fantastic ocean views and a private plunge pool. The first-floor Infinity Pool Swim-up Casita Suites are oceanfront with a private pool that connects to the winding river and swim-up pool bars.
El Dorado Royale boasts 15 bars including a Martini Bar and 9 swim-up bars. The swim-up bars also serve snacks so you never have to leave the pool. Evening entertainment at the Royale offers variety and unusual venues like Las Guacamayas bar which has swinging bar seats from which to enjoy your favorite Karaoke performance.
Restaurants at El Dorado Royale are also unique. At Las Fuentas Restaurant you have an interactive dining experience with 5 open kitchens under a 90 foot vaulted thatched roof. The restaurant is packed with flat screen TVs featuring instructional cooking techniques from the resorts' Michelin trained chefs.
Other restaurants at El Dorado Royale are La Cabana Pizzeria, Rincon Mexicano, Jo Jo's Caribbean Seaside Grill, the Healthy Bar, Le Fondue and El Cocotal. 24 hour room service is available for all El Dorado Royale guests.
The resort is large but golf carts come along every few minutes to take you anywhere you'd like, bicycles are available for traversing the resort and many guests choose to walk after enjoying the gourmet food and all inclusive bars.
Destination weddings are popular in Mexico and El Dorado Royale has the perfect setting. With a minimum number of rooms the ceremony is free and you have the choice of a beach wedding or beachfront wedding chapel plus complimentary honeymoon and anniversary packages.
Call Sandi or Linda at (425) 821-4100 with your questions or to book your all inclusive vacation, honeymoon or wedding and ask about a complimentary room upgrade, private dinner or massage at El Dorado Royale and Casitas Royale!
El Dorado Seaside Suites are located about an hour south of Cancun and this is the resort to choose if you'd like to relax on a beautiful beach but have access to some of Mexico's best natural and cultural attractions.
Nearby attractions include the natural aquarium of Xel-Ha, the Mayan ruins of Tulum and Xcaret eco park with its "swim with the dolphins" and excellent evening show. Shoppers staying at El Dorado Seaside enjoy the promity to Playa del Carmen and a short and inexpensive ferry ride to Cozumel provides additional options.
El Dorado Seaside Suites is smaller than El Dorado Royale and larger than El Dorado Maroma and is located on more than a mile long stretch of beach. The 280 Junior Suites are in 2 or 3 story buildings and all feature Jacuzzi tubs, Mexican décor, complimentary mini-bar, and a terrace or balcony. Most have a great hammock.
Room service is available 24 hours per day, so breakfast in bed, cocktails on your terrace, or champagne and chocolate covered strawberries can be an everyday reality. It's all included!
El Dorado Resorts are known for the Gourmet Inclusive concept and El Dorado Seaside Suites is no exception. There are no buffets at an El Dorado Resort and you'll always find a menu and personal service whether you choose a wood-burning pizza or burger at the Sandwicherie or fine Asian dining at the Klay Talay. All restaurants are non smoking and none require reservations.
The bars at El Dorado Seaside are also unique. The swim up bar Gaviota and Lounger is located in the heart of the hotel where you can enjoy birds and waterfall sounds. Las Guacamayas is the bar with swings, tropical music and exotic cocktails including 32 different varieties of Tequila. Excellent Mexican beers are on tap and the house wine is bottled especially for the El Dorado resorts by a boutique vineyard in Chile. Special occasion, candlelight dinners are available on the beach.
Accommodations range from standard Jacuzzi suites which have beautiful garden views to the Honeymoon Premium suites with their own private pool to the Presidential suites with outdoor Jacuzzis! There are also 49 swim-up Jacuzzi Jr. Suites which allow you to step from your patio into the pool.
The honeymoon premium suites are in blocks of 3. The 3 suites share a pool; each is assigned a beach bed, and each has an outdoor shower. You can even spend the night in your private beach bed and enjoy the sound of waves all night!
Presidential suites are on 1st and 2nd floor. First floor has larger pool & Oceanview Jacuzzi with private beach beds and beautiful courtyard. 2nd floor has a smaller pool with an Oceanview Jacuzzi.
There are more than 100 beach beds plus lounge chairs scattered along the beautiful mile long beach. Beach beds and chairs are 1st come 1st served. Food & drinks are served on the beach and beachfront massage packages are available through the full-service spa.
Activities include beach volleyball, salsa lessons and yoga on the beach. Non motorized water sports, such as kayaking and snorkeling are also included. Evening entertainment includes live music, dancing and shows.
Call Sandi or Linda at (425) 821-4100 with your questions or to book your all inclusive vacation, honeymoon or wedding and ask about a complimentary room upgrade, private dinner or massage at El Dorado Seaside Suites!
El Dorado Maroma – is a small resort with an intimate, romantic, ambiance and only 72 suites in total. The resort is 10 minutes from Playa del Carmen and allows guests 16 and older.
The beach at El Dorado Maroma has been designated by Discovery Channel as one of the top beaches in the world and the sand stays cool, even in the hot tropical sun. King size beach beds are plentiful and service is provided by beach butlers, so you never have to leave! A beachside gazebo is available for an oceanfront massage during the day or for a candlelight dinner in the evening.
Room categories range from beachfront suites with spectacular views of the Caribbean, to a honeymoon suite with huge terrace and great views. Two room categories have pools right outside your door – Swim-up Suites are on the ground floor, so you walk off your private patio right into the water and Infinity Pool Suites have a pool on the balcony with fantastic views. Every suite at the El Dorado Maroma has an in room Jacuzzi tub big enough for two.
Meals are prepared and served very creatively and this is a "Gourmet Inclusive" El Dorado Resort so everything is included. Restaurant choices include Italian, Oriental, Mexican and special weekly treats such as Thursday's "choose your own fish dinner", Wednesday's taco bar and Friday's BBQ.
El Dorado Maroma has a lovely beachfront wedding chapel which seats 80, but the maximum for a wedding reception at the resort is 50.


The Chinese company OnePlus continues to work closely with its community. This time, she offered to create new features dedicated to OxygenOS, which could be selected and implemented to mobile devices of the brand.
OnePlus and his community, a long love story. In January 2019 already, the Chinese firm gave the opportunity to its users to suggest new features and system improvements for the year 2019. This time, the group pushes the concept a little further and calls on its fan basis for designing the next features of the OxygenOS operating system, in the form of a #PMChallenge.
What is the added value for the user?
If there is comparable functionality in the mobile industry, how is yours better?
Explain the logic behind this product and how do you want it to be implemented.
Include indications and details via diagrams in the form of sketches. Draw each screen and display the scroll.
Product pole: does this contribute to a smooth experience?
Development pole: how do the different parts of the existing OS interact with the new feature?
The UX Design pole: what will the user experience look like? Does the current experience create an optimal user journey?
The company's software teams will select the best ideas and integrate them into the OS in the process. The announcement of the winners will take place mid-March, period from which the developers of the group will begin their work. To reward each contributor, a private and VIP event will be organized. Not to mention to offer them a mobile device of the brand.


text:
Home > Get Ready to Witness a Lighting Spectacle at LED Expo Thailand + Light ASEAN
Get Ready to Witness a Lighting Spectacle at LED Expo Thailand + Light ASEAN
The 7th edition of the much-acclaimed show will be held from June 27-29 in Bangkok this year, and will witness a gathering of notable stakeholders from the LED lighting world.
New Delhi, April 19, 2019: LED Expo Thailand + Light ASEAN is revered as one of the most popular shows in the ASEAN region. Over the last six years, its organisers have taken the show to new heights, adding some highly relevant and significant facets to its organisation. It is targeted at showcasing the best-in-class lighting innovations and technologies, and will work as a platform for bringing together the who's who of the lighting world. The organisers, MEX Exhibitions Pvt. Ltd. and Impact Exhibition Management Co. Ltd., have started pre-registration for visitors, who are interested in exploring the prominent Show.
LED Expo Thailand has been designed to make visitors aware of various LED-centric applications available in the market, and how they will define the trends over coming years. The exhibition has now been expanded to include solar products; LED signage, LED technology for entertainment, agriculture, etc., and this will help in opening a door of opportunities for the entire lighting fraternity. There will be a lot to grasp for prospective entrepreneurs from the exhibition, which will help them understand the nitty-gritties of the lighting business.
From the point of view of exhibitors, there will be a lot to look forward to in terms of diverse categories of visitors who would converge at the show. There will be representatives and officials from leading lighting companies as well as from the government sector. It will allow them to interact with such visitors and from long term associations for a flourishing business. All participants will get an opportunity to understand the needs of the ASEAN market and gain access to it. It will give a golden opportunity for companies seeking to enter South East Asian market to network and partner with LED players in that region.
The 2018 edition of LED Expo Thailand witnessed the presence of 243 exhibitors from 12 countries showcasing their products to 12,347 visitors from 47 countries along with 656 business meetings, establishing a multitude of new trade partnerships.
The 2019 edition is expected to welcome 250+ exhibitors catering to the sourcing needs of more than 15,000 visitors from all across the world. Thus, LED Expo Thailand provides an unmatched opportunity for all stakeholders of the lighting industry to come and benefit from all that is on offer.
Thailand's LED lighting market accounts for 12% of the total lighting market share with a projected growth rate of CAGR 30% during 2015-2020. At this juncture, it is evident that a Show like LED Expo Thailand can prove to be a dynamic platform for the growth of this industry.
It will give a chance for industry professionals to experience new technologies as well as continue their education through a wide range of academic sessions by renowned LED and lighting leaders.
This will be an area where exhibitors showcase their advanced lighting systems and lighting design solutions.
It's a comprehensive conference represented by BUILD department (BOI) targeting key buyers mainly in Electrical, Electronics and PCB industries. This conference will serve as an effective networking platform for exhibitors and local buyers.
HIGHLIGHT ZONES:
A special pavilion for new technologies that would bring forth smart lighting innovation for factory, building and streets, displaying latest innovations and system applications, as how technology can play part in making smart cities.
A dedicated zone for leading Thai LED manufacturers who will showcase their most innovative and latest LED products and technology.
A platform that would facilitate the display of innovative and trending LED signage with applications in retail, hospitality and government sectors.
A specific zone that will highlight high performance PCB technology, products and services.
About The Organisers:
MEX Exhibitions Pvt. Ltd. is an international exhibition company with a strong presence of over four decades in the advertising industry, over 20 years in publishing & 16 years in exhibitions. The company has produced more than 100 market-leading trade exhibitions for various segments in addition to publishing various magazines & advertising trade directories of repute. Successful exhibitions are conducted all over India, Dubai, Singapore and Thailand.
IMPACT Exhibition Management Co., Ltd. is the leading exhibition organiser in Thailand. IMPACT organises and manages professional trade and public exhibitions, conferences, meetings and trainings, working hand-in-hand with international trade associations, organisers and corporations across a broad spectrum of industries.
IMPACT creates effective market platforms and offers a comprehensive range of turnkey event management solutions ranging from market research, exhibition and visitor promotion and sales, advertising and promotion, public relations, operation to on-site logistic management for exhibitions and conferences of all sizes and industries. It also specialises in business matching programs.


Project Justice a program that is part of our St Thomas Chaldean diocese and was established in 2014 in response to 150,000 Christians that were displaced in Iraq. Justice has been working tirelessly for our community and have established a sector of volunteer attorneys and legal professionals who assist refugees with legal issues. These professionals have been working diligently regarding immigration issues and also for those who have recently been detained. These attorneys are working on a pro bono or low pro bono basis. Immigration cases take months of research as well as court hearing attendance, so Project Justice has established a legal fund that will be used to assist families who cannot afford a lawyer. It is important to note that these funds will be carefully distributed to families who have been vetted for the aid. The funds will not be given without proper vetting. It is a sensitive time for our people and Project Justice wishes to do everything they can to help, it is important we help where we can. Project Justice is part of HelpIraq.org which is a 501(c)(3) so your contribution is fully deductible. Please go on HelpIraq.org to donate to Project Justice so that we may continue this very important work.
You can also donate by person at our helpiraq booth.


I love touchy feel books, they really do grab (sometimes literally) the attention of the smallest readers amongst us. Having said that, Red Ted (now 2.5yrs) still likes to look at all our touchy feely books, especially now that Pip Squeak (7 months) has taken an interest.
That is not my Puppy, Fiona Watts and That is not my Monster. We LOVE all the Fiona Watts "That is not my.." range. They are simple, lovely books – nice to hold with nice textures – some better than others though… our two favourite ones are "That is not my Puppy" and "That is ot my Monster". Red Ted LOVED the monster one when he was small (6mths onwards) and I THINK Pip Squeak really likes the Puppy one – but that is maybe because Red Ted always runs off with the monster book!
I have been wanting to make a touchy feely book with Red Ted for ages. And have silently been collecting bits and bobs whilst figuring our what we will be doing. Also, I want to make a "special one" as a keep sake for Pip Squeak, so didnt want to let loose to early. I decided the best course of action, was to let Red Ted have a go and to do mine separately. Red Ted's actually turned out very well, is mine needed?!
I did all the cutting and Red Ted did all the sticking. He was surprisingly good at it and only had to show him once to put the glue on the pack of a photo. I did have to stop him once from sticking EVERYTHING on the photo, and I had to help with the wool as he didn't like it sticking to his fingers, but otherwise he did it himself.
I "bound" Red Ted's book by cutting a normal folder down.
And now to the "naughty" part.
I love Red Ted's book and I think it came out brilliantly. And I was very much in two minds about to makeing "mine" too. I didn't want to "devalue" Red Ted's book. I did go ahead. The main reason being, that I still have many touchy feely bits that I have saved (corrugated card, rustly paper) and that Red Ted only had so much of an attention span and the second reason being, that I wanted to make a little keep sake. I don't know if either of these excuses are enough, but I guess you could also say, that by "doing your own", I am giving craft ideas to mums with wee babies as well as uncles/ aunties etc that would like to make something.
I made my book out of an old presentation – used the front and back as front and back and the presentation deviders (a little thicker paper) for my pages. This however would look FABULOUS if you bought a simple card photo album. Thrifty me decided to recycle.
So here is my attempt. I have only made the 1st 5 pages, as like Red Ted, my concentration span is limited + I haven't decided on the final pages. I am using bull dog clips to hold it all together for now (so I can add pages), but will "bind it more permanently (staples?)" once it is done (I have 12 pages!). I hope you like!
stART: Busy Airport – Cotton Wool Clouds and, erm, PIGS!
stART: Hurray for Fish – one for babies or messy toddlers!
Craft: Peg animals – toddlers can help!
We still have That is not my Lion and a few more of the same range on our shelves, they are great. I love the idea of making your own touchy feely book and Red Ted's book is fantastic. Thanks for the tip, we'll try this one.
Ooh, do share your results – would love to see it – and as you are such a fab recycler, I bet you will find some great touchy feely things to add! I have a lovely bit of lace I will use for the next few pages.. can't wait. Very tactile!
What a great idea! Pat the bunny was one of my favorite books as a kid and the page with "daddy's scratchy face" (sand paper) was worn smooth by the time me and my sister were done with the book!
We absolutely loved the "That's Not My…." books. I really got a bit misty when I was ready to pass them on to a friend.
Emily and Juliette both love touchy feely books (and lift the flap books too) they definitly grab the younger ones attention and make books exciting for them. Emily would have so much fun making her own touchy feely book. I am going to check out the "That's Not My…" books too, they look adorable.
Yes, great minds think alike! Will DEFINITELY be given your sandpaper a go! And just ordered the Nursery Dr Seuss!! Also, will be doing your Strawberry book next week! Love this sharing of ideas and books!!
What a grea idea and they came out so nicely!
That seems like such a fun sensory experience. Great idea!
Great idea! Be interesting to see if your son likes to "read" his book or the bought ones.
This book looks great. The texture book you made is wonderful. I love the way it turned out.
We have the "That's not my pirate book" and we love it too. (We actually love all of our usbourne books!) We will have to try this craft. great idea!
Ooh yes! Do have a go!!! It is simple, but they love it!
This is brilliant brilliant brilliant – I love it!
They look like great books and such fun art projects. Learning is always so much more meaningful if it is tactile and hands on (espeically for boys I find).
From Alissa@ Excuse Me Mrs.C!
Your books look utterly charming!
I love both versions – I think your touchy-feely books look awesome. I am a big fan of "This is not my…" series as well.
I noticed we both had touchy feely books this week too. I've actually never tried the "That's not my…" books. I can't wait. I LOVE finding new books! Thanks for sharing.
yes, it is touchy feely week by the looks of it! They are lovely (simple) range of books! worth getting one or two!
Ohhh…what a cute idea! I love that your little guy made his very own "Touchy-Feely" book! What great creativity!!! Thank you so much for sharing this sweet project with us for the Sunday Favorites party! Sure enjoyed having you!!!
What a fun idea! I LOVE those books, they are the only ones that my 17 month old will sit through!
Thanks so much for joining us for our 13th Anything Related party!


text:
The 4 Best Movies on Netflix Right Now (& 2 Ways to See Sharon Tate)
By Kristen Yoonsoo Kim
So, I think I may have Quentin Tarantino FOMO. This past month, I've mostly been home in Korea, where the latest Tarantino film, Once Upon a Time in Hollywood, has not yet been released. I've seen some reactions online in my peripheral vision, while trying my best to avoid lengthy plot descriptions. The basic premise is that it's a comedy drama set in 1969 Los Angeles and I also know Margot Robbie plays the tragically murdered '60s It Girl Sharon Tate. (Another thing that's been in my peripheral vision: the shirt Tarantino's been wearing, which looks like Gucci at first glance, but is actually just a 69 shirt? I still can't decide whether I love it or hate it or if I…want it?)
I absolutely do not have FOMO as it relates to the discourse around him at the moment. I briefly checked Twitter while on vacation in Japan this week, and saw a flurry of takes about how he makes movies for only the "white film bro," and everyone had something to say about that. I promptly decided to log off and steam my face over a bowl of shoyu ramen.
I know getting excited about a new Tarantino movie sounds like stereotypical film bro-iness, but I am neither white nor male, and there are many of us who still want to engage with his work in a meaningful manner without simply brushing him off because we all know at least one guy who had a Reservoir Dogs poster in his college dorm room.
So, until I'm able to update you all with my Once Upon a Time reaction, I can recommend some good streaming accompaniments: On August 1, Netflix is bringing back Jackie Brown, one of Tarantino's best (if not the best?) movies, starring the legendary Foxy Brown herself, Pam Grier, in her middle-aged comeback as a flight attendant caught between her bad boss (Samuel L. Jackson) and the feds. I think it's better than Pulp Fiction—and the subdued violence (for Tarantino), makes it even more witty and thrilling. Tarantino made the movie for Grier, breaking a long hiatus after her '70s Blaxploitation era, and the way Jackie Brown mirrors her real-life anxieties about being past her prime is unexpectedly heartfelt.
Some looks are too powerful to emulate and I know this is one I'll just have to appreciate on-screen.
It's no Pam Grier Summer Kangol look but… here I am before a movie at MoMA, wearing a Laulhère beret, Marc Jacobs skirt, hand-me-down shirt from my mom's friend, and a dark green trench I thrifted from an L.A. flea market. MoMA bathrooms are usually crowded, but on the rare chance you get it all to yourself, do take advantage of the excellent selfie lighting.
If You'd Rather Groove to the Free-Loving '60s Vibe…
The real Sharon Tate can be seen in all her glory in The Valley of the Dolls, which is quintessentially '60s in its high-ponied, pastel looks. Tate, Patty Duke, and Barbara Parkins star as three young women who navigate romance and try to make it big in show biz. Along the way, they hit some lows ("valleys"), and pick themselves up with "dolls" (read: pills). It is capital-C Camp and Elle Fanning paid perfect homage to it at this year's Met Gala. The Valley of the Dolls is available to rent on a bunch of different platforms (iTunes, Google), but if you're in New York, head over to the Quad Cinema next month to catch it during the "Beach Reads: From Sand to Screen" series, which includes many adaptations of "guilty pleasure" novels (if you even believe in the concept!). They're not all beachy movies, but they're perfect A/C-fueled escapes.
The Criterion Channel (have I mentioned it's my favorite streaming service?) has also highlighted three movies released in the summer of '69, the summer of the moon landing, Stonewall, Woodstock, and, of course, the Manson murders. These movies, including Midnight Cowboy and Easy Rider, leave July 31 so get on them ASAP, but I suggest prioritizing Paul Mazursky's Bob & Carol & Ted & Alice, an infidelity comedy about two couples who want to loosen up and try their hands at spouse-swapping—to hilariously awkward results.
Orgies seem stressful, but this movie has made me want to dress in lingerie as fanciful as my outerwear.
Let's Skip Forward to the Summer of 1970
Pull on a pair of jorts and tie a colorful, oversized summer blouse over them, because Now and Then is also coming to Netflix on August 1. In Lesli Linka Glatter's coming-of-age cult classic, four female friends reminisce about their teenage selves during one unforgettable summer in 1970. It always makes me think of my carefree childhood days, biking around and stopping for ice cream with my buds. I used to wear thick, stretchy headbands like Gaby Hoffman does, though Mallory mentioned Devon Sawa might be the real style hero of this movie and… wow, she's right. I am so inspired by this subtle stripe coordination of his jacket collar to shirt collar to socks.
For Even More Sister Acts…
August is a great month for sororal bonding over at Netflix. Joining Now and Then is The House Bunny—you know, that Anna Faris movie about an ex-Playboy Bunny who takes a group of nerdy sorority sisters under her wings (ears?), including one about-to-breakout Emma Stone. I haven't seen this movie in 10 years, but I do distinctly remember practicing that demonically deep voice Faris uses to help her remember names (I stand by my long-held belief that she is an underrated comedic genius). I also just realized that within the decade of not having watched this, I've aged a year past 27-year-old Shelley (Faris), who gets kicked out of Hugh Hefner's mansion for being too old….
On a slightly different plane of sisterhood are Carrie, Samantha, Charlotte, and Miranda—yes, the first Sex and the City movie is also coming to a Netflix carousel near you. As someone who loves the show through its sometimes awkwardly-aged politics, the movie feels cheap to me. Cheap—not literally, because holy shit that penthouse Mr. Big casually buys for Carrie is actually insane. What I mean is cheap in all its clichés and basest appeal to fandom. Like that scene where Carrie tries on all her old clothes including that infamous tutu? It's fun in the moment, but it's nothing more than a "previously" recap filling out the 2.5-hour runtime. Also, I'll never forget how everyone in this movie has relationship problems except Charlotte, so they make her literally shit her pants in Mexico?? I mean?! (Feel free to get "carried away" in the comments if you agree or disagree with me on this one.)
Okay, admittedly, Charlotte is very relatable in this scene. I would absolutely say this to any man who hurts my friend this badly.
Squeeze in a French Fling This Summer
Since I've been in Korea for most of the summer, I've replaced my usual rotation of NYC repertory theaters for Cinematheque Seoul Art Cinema, which showcased a bunch of great summer movies by one of my favorite directors, Éric Rohmer. A couple weeks ago, I went to go see the 1987 comedy Boyfriends and Girlfriends (another movie about partner-swapping), which makes a great case for summer minimalism with its bare interiors and simple, color-blocked outfit coordination.
The Cinematheque Seoul Art Cinema bathroom has Hollywood-style dressing room mirrors. I wore this Reneevon dress to mimic the bright colors of 'Boyfriends and Girlfriends' and I think the netted quality of the outfit was subconsciously inspired by a mesh tank top worn by a man in a different Rohmer movie.
From Rohmer's 'The Green Ray' (1986). Another strong summer look.
The Green Ray is one of my annual summer re-watches (it's basically the movie version of "Summertime Sadness"), as is La Collectionneuse, about a girl who "collects" men during a summer stay at a beautiful French villa. Both are available on the Criterion Channel and make me feel moody and wistful, even on—especially on—vacation.
If this ain't a mood….
A current highlight on Criterion right now is a collection of films starring the late Jeanne Moreau, who is my favorite French femme fatale. The French New Wave icon took on a lot of complicated, edgy roles, and wore the history of her characters on her face (especially in her very seductive, charismatic eye bags). Any movie starring Moreau is worth watching, in my opinion, but her best-known (and probably a good place to start) is Truffaut's Jules and Jim, in which two male friends become enamored with her.
Jeanne Moreau's breakout came with Louis Malle's Hitchcockian noir, Elevator to the Gallows, also available on the Criterion Channel.
This year has seen a few great French films as well. I highly recommend A Faithful Man, currently playing selected theaters. The hunky Louis Garrel directs himself in a comic yet tragic love triangle (I guess actually a rectangle) involving his ex (Laetitia Casta), who left him for his now-dead best friend years ago, only to crawl back when a younger woman (Lily-Rose Depp) starts pursuing him. It is a very, very French affair and very entertaining. Another French romance film from this year, the gay 1993-set drama Sorry Angel, has recently been added to Netflix. It is as blue as the film's nearly monochromatic hue, and one of my favorite releases of 2019 so far.
Globe-Trot Over to China
Have y'all seen Lulu Wang's The Farewell yet? It's one of the best movie tickets you could spend your hard-earned money on at the moment. Remember when I said Always Be My Maybe felt like an Asian-American Vox explainer? Well, The Farewell, which stars Awkwafina in her first leading role as a Brooklyn-residing Asian woman who flies back home to China to covertly say goodbye to her dying grandmother, is the opposite of that. It totally nails that first-generation immigrant feeling in such a poignant and well-humored manner.
I wore a cheongsam gifted by my good friend Alexandra to Metrograph's second anniversary party last year. Is it problematic to wear this even if I am Asian? Perhaps I am…In the Mood for Drama.
In a Chinatown slightly closer to my place of residence, New York's Metrograph theater will be showing a bunch of women-directed movies from Hong Kong's Shaw Brothers Studios, the massive production company famous for popularizing the kung-fu genre (from August 23–September 1). I've been meaning to brush up on my Asian cinema so I'm stoked to discover these rarely-screened, little-seen movies that range from murder mysteries to ghost hauntings to lesbian love stories. If you're not in New York, many of these movies may be hard to find online, but Ann Hui's Love in a Fallen City is on Amazon Prime.
And Speaking of Female Auteurs…
Before 'Carol,' there was the sweaty, sizzling romance of Donna Deitch's Reno-set 'Desert Hearts.' Yee—and I cannot stress this enough—haw.
Brooklyn's BAM theater is chasing their currently screening "Millennials on Film" series with a truly incredible lineup of movies directed by American women in the '80s: Desperately Seeking Susan, Losing Ground, Variety, and Desert Hearts, to name a few. They're all so good that I don't really know where to start with recommendations. Maybe just dedicate your entire August to working your way through these movies (most of which are available to watch online). It'll feel like spending your summer hanging out with all the adventurous friends you've ever dreamed of having.
Feature photo by ©New Line Cinema via Everett Collection.
Kristen Yoonsoo Kim
Kristen Yoonsoo Kim is a South Korea-born, New York-based writer. She's literally always at the movies.
@https://twitter.com/kristenyoonsoo
@binchuation
3 Months, $378, and Infinite Feelings Later: Crystal Anderson's Outfit Anatomy
By Crystal Anderson
Writers Club: Holding Onto Others Is Hard and Messy—It's Also Worth It
By Daniela Guerrero
In partnership with Lelo
Let's Talk About Queer Sex and Love, Baby
By Amalie MacGowan
3 Older Detroit Residents on Life During the Pandemic
By Tess Garcia


Your referrals receive a voucher for 80 off their first stay.Free stay is only applicable on the accommodation part of giveaway random picker the package (with or without transport).Extra toppings are chargeable.To give the most up-to-date Club Med UK Discount Codes, our dedicated..
NPR (November 14, 2014) Iran hints at early release for detained Washington Post reporter - CS Monitor (November 6, 2014) Long Beach Community College Trustee Sunny Zia clashes spoils discount stores with veteran colleagues - Press Telegram (November 3, 2014) US to get..
Imagination Pavilion (the old ImageWorks) is being taken out of mothballs to be transformed into a DVC member lounge with seating, complimentary soft drinks, wi-fi, charging stations, computers with printers and member services advisors.25 and March.Top Of The World Lounge at promo code..
Website m, facebook fans n/a.
Scratches, bag marks, staple marks, and corrosion will decrease a the trees remember coupon code coins value.Hallenbeck Coin Gallery About Blog Follow Hallenbeck Coin Gallery to get information about different coins.Duluth, GA About Blog The goal is to provide you with the most up-to-date information on the gold, silver and platinum markets, the latest coin news, exciting new coin inventory offerings and educational resources Frequency about 1 post per month.Auctions The rarest and most expensive coins are often available only through auctions.Atlanta, GA, about Blog, coin Update was launched by Michael Zielinski in 2009.The blog offers an eclectic and diverse inventory that you are sure to find interesting.Gov Facebook fans 94,611.Atlanta Gold Coin Buyers.Follow the blog for the latest news and info on collectible coins, currency, diamonds, jewelry, gold, and other valuables Frequency about 1 post per month.You may want to ask an experienced collector to suggest reputable dealers.Our goal is very simple, we want to provide a better place for you to find coin shows in your area.
Timely and relevant US mint news for collectors Frequency about 5 posts per week.
Pocket Change New York, NY About Blog Pocket Change is a blog of the American Numismatic Society, an organization dedicated to the study of coins, currency, medals, tokens, and related objects from all cultures, past and present.
David's Coin Travels About Blog Follow David journey across the country collecting elongated coins Frequency about 1 post per week.
Google News Coin Collecting Mountain View, CA About Blog Comprehensive up-to-date coverage for coin collecting, aggregated from news sources all over the world by Google News.
Ancient Coin Collecting Missouri, USA About Blog Find comments related to numismatic topics of personal interest.The goal is to educate and inspire collectors by sharing ideas and information.Buying and Trading Coins If you are unable to find what youre looking for in our catalog or Coin Seller Database, you may also find coins through: Banks Search through coin rolls from a bank.Variety errors Everything on Variety and Error Coins North Carolina, USA About Blog Find all the information on error and variety coins that can help you grow as a collector.Coins and paper money, the source for collectors since 1952.Website m/blog/en Facebook fans 3,391.Build Your Collection, a combination of buying and finding coins can be a good way to build your collection.Mullen coins About Blog This coin collector blog provides you with updates and information about coins.Old Pueblo Coin Tucson, AZ About Blog Old Pueblo Coin deals in currency, coins, jewelry, gold, silver, diamonds, tokens, medals, collectables, documents, autographs, flatware choice rewards travel phone number silverware, watches.Change Checker United Kingdom About Blog Change Checker allows you to start and build a full collection of designs, including all 29 of the sports 50p coins which were minted for the 2012 Olympic Games.Follow to know more.Website m Facebook fans 1,482.
Coined For Money New York City About Blog The purpose of this blog is to contribute general knowledge to world of numismatics.