Skip to content

Instantly share code, notes, and snippets.

@stiucsib86
Last active February 16, 2018 23:45
Show Gist options
  • Save stiucsib86/6337248 to your computer and use it in GitHub Desktop.
Save stiucsib86/6337248 to your computer and use it in GitHub Desktop.
Android ChatHead Service
public class ChatHeadService extends Service {
private WindowManager windowManager;
private List<View> chatHeads;
private LayoutInflater inflater;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
inflater = LayoutInflater.from(this);
chatHeads = new ArrayList<View>();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final View chatHead = inflater.inflate(R.layout.service_chat_head, null);
TextView txt_title = (TextView) chatHead.findViewById(R.id.txt_title);
TextView txt_text = (TextView) chatHead.findViewById(R.id.txt_text);
txt_title.setText(intent.getStringExtra("title"));
txt_text.setText(intent.getStringExtra("text"));
chatHead.findViewById(R.id.btn_dismiss).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
windowManager.removeView(chatHead);
}
});
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, 0, PixelFormat.TRANSLUCENT);
params.gravity = Gravity.CENTER;
chatHead.findViewById(R.id.txt_title).setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(chatHead, params);
return true;
}
return false;
}
});
addChatHead(chatHead, params);
return super.onStartCommand(intent, flags, startId);
}
public void addChatHead(View chatHead, LayoutParams params) {
chatHeads.add(chatHead);
windowManager.addView(chatHead, params);
}
public void removeChatHead(View chatHead) {
chatHeads.remove(chatHead);
windowManager.removeView(chatHead);
}
@Override
public void onDestroy() {
super.onDestroy();
for (View chatHead : chatHeads) {
removeChatHead(chatHead);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment