package com.lesgens.blindr; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.MediaStore; import android.util.Base64; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnOpenListener; import com.lesgens.blindr.adapters.MatchAdapter; import com.lesgens.blindr.adapters.PublicChatAdapter; import com.lesgens.blindr.controllers.Controller; import com.lesgens.blindr.listeners.EventsListener; import com.lesgens.blindr.models.City; import com.lesgens.blindr.models.Event; import com.lesgens.blindr.models.Match; import com.lesgens.blindr.models.Message; import com.lesgens.blindr.models.User; import com.lesgens.blindr.network.Server; import com.lesgens.blindr.receivers.NetworkStateReceiver; import com.lesgens.blindr.receivers.NetworkStateReceiver.NetworkStateReceiverListener; import com.lesgens.blindr.utils.Utils; public class PublicChatActivity extends Activity implements OnClickListener, EventsListener, OnItemClickListener, OnOpenListener, NetworkStateReceiverListener { private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; private Typeface tf; private ImageView sendBt; private PublicChatAdapter chatAdapter; private StickyListHeadersListView listMessages; private EditText editText; private ImageView menuPrivate; private SlidingMenu slidingMenu; private ListView listPrivate; private MatchAdapter matchAdapter; private ScheduledExecutorService scheduler; private Future<?> future; private TextView tvConnectionProblem; private NetworkStateReceiver networkStateReceiver; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Remove title bar this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.public_chat_container); TextView city = (TextView) findViewById(R.id.city_name); tvConnectionProblem = (TextView) findViewById(R.id.connection_problem); tf = Typeface.createFromAsset(getAssets(), "fonts/Raleway_Thin.otf"); city.setTypeface(tf); city.setText(Controller.getInstance().getCity().getId()); editText = (EditText) findViewById(R.id.editText); editText.clearFocus(); slidingMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout); slidingMenu.setOnOpenListener(this); sendBt = (ImageView) findViewById(R.id.send); sendBt.setOnClickListener(this); if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA) == false){ findViewById(R.id.send_picture).setVisibility(View.GONE); } else{ findViewById(R.id.send_picture).setOnClickListener(this); } menuPrivate = (ImageView) findViewById(R.id.menu_private); menuPrivate.setOnClickListener(this); chatAdapter = new PublicChatAdapter(this, new ArrayList<Message>()); listMessages = (StickyListHeadersListView) findViewById(R.id.list); listMessages.setAdapter(chatAdapter); listMessages.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); matchAdapter = new MatchAdapter(this, new ArrayList<Match>()); listPrivate = (ListView) findViewById(R.id.list_private); listPrivate.setAdapter(matchAdapter); listPrivate.setOnItemClickListener(this); networkStateReceiver = new NetworkStateReceiver(this); Server.addEventsListener(this); Server.getMatches(); scheduler = Executors.newSingleThreadScheduledExecutor(); } @Override public void onResume(){ super.onResume(); if(scheduler != null){ future = scheduler.scheduleAtFixedRate (new Runnable() { public void run() { Server.getEvents(); } }, 0, 5, TimeUnit.SECONDS); } networkStateReceiver.addListener(this); this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); } @Override public void onPause(){ super.onPause(); if(future != null){ future.cancel(true); } networkStateReceiver.removeListener(this); this.unregisterReceiver(networkStateReceiver); } @Override public void onDestroy(){ super.onDestroy(); if(scheduler != null){ scheduler.shutdownNow(); } Server.removeEventsListener(this); } @Override public void onBackPressed(){ if(slidingMenu.isMenuShowing()){ slidingMenu.toggle(true); } else if(chatAdapter != null && chatAdapter.isOneOpened()) { chatAdapter.closeAllSwipeLayout(); } else{ super.onBackPressed(); } } @Override public void onClick(View v) { if(v.getId() == R.id.send){ final String text = editText.getText().toString(); if(!text.isEmpty()){ Message message = new Message(Controller.getInstance().getMyself(), text, false); chatAdapter.addMessage(message); chatAdapter.notifyDataSetChanged(); Server.sendPublicMessage(Controller.getInstance().getCity(), message.getMessage()); editText.setText(""); scrollMyListViewToBottom(); } } else if(v.getId() == R.id.menu_private){ hideKeyboard(); new Handler(getMainLooper()).postDelayed(new Runnable(){ @Override public void run() { slidingMenu.toggle(true); }}, 200); } else if(v.getId() == R.id.send_picture){ takePhoto(); } } private void scrollMyListViewToBottom() { listMessages.post(new Runnable() { @Override public void run() { // Select the last row so it will scroll into view... listMessages.setSelection(chatAdapter.getCount() - 1); } }); } public void takePhoto() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { getContentResolver().notifyChange(imageUri, null); new Handler(getMainLooper()).post(new Runnable(){ @Override public void run() { try { Bitmap bitmap = android.provider.MediaStore.Images.Media .getBitmap(getContentResolver(), imageUri); ByteArrayOutputStream stream = new ByteArrayOutputStream(); final Bitmap bitmapScaled = Utils.scaleDown(bitmap, Utils.dpInPixels(PublicChatActivity.this, 250), true); bitmap.recycle(); bitmapScaled.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); String encoded = Utils.BLINDR_IMAGE_BASE + Base64.encodeToString(byteArray, Base64.DEFAULT); Message message = new Message(Controller.getInstance().getMyself(), encoded, false); chatAdapter.addMessage(message); chatAdapter.notifyDataSetChanged(); Server.sendPublicMessage(Controller.getInstance().getCity(), message.getMessage()); scrollMyListViewToBottom(); } catch (Exception e) { e.printStackTrace(); } }}); } } } private void hideKeyboard(){ InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } @Override public void onEventsReceived(List<Event> events) { boolean alreadyCalledNewMatches = false; for(Event e : events){ if(e instanceof Message && e.getDestination() instanceof City){ if(!Controller.getInstance().getBlockedPeople(this).contains(((Message) e).getUser().getId())){ chatAdapter.addMessage((Message) e); chatAdapter.notifyDataSetChanged(); scrollMyListViewToBottom(); } } else if(e instanceof Match){ if(!alreadyCalledNewMatches){ Server.getMatches(); alreadyCalledNewMatches = true; } } } } @Override public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) { Match m = ((Match) adapter.getItemAtPosition(position)); if(m.isMutual()){ PrivateChatActivity.show(this, m.getMatchedUser().getId(), m.getRealName()); slidingMenu.toggle(true); } } public void onOldMatchesReceives(List<Match> matches) { Controller.getInstance().setMatches(matches); matchAdapter.clear(); for(Match match : Controller.getInstance().getMatches()){ matchAdapter.add(match); } matchAdapter.notifyDataSetChanged(); } @Override public void onUserHistoryReceived(List<Event> events) { // TODO Auto-generated method stub } @Override public void onUserLiked(User user, String userFakeName) { Match match = new Match(UUID.randomUUID(), null, user, Controller.getInstance().getMyself(), false, null, userFakeName); matchAdapter.add(match); matchAdapter.notifyDataSetChanged(); } @Override public void onOpen() { hideKeyboard(); } @Override public void onNetworkAvailable() { tvConnectionProblem.setVisibility(View.GONE); sendBt.setEnabled(true); } @Override public void onNetworkUnavailable() { tvConnectionProblem.setVisibility(View.VISIBLE); sendBt.setEnabled(false); } }