package com.madeinhk.english_chinesedictionary.service; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Handler; import android.os.IBinder; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.ToggleButton; import com.madeinhk.english_chinesedictionary.DictionaryActivity; import com.madeinhk.english_chinesedictionary.R; import com.madeinhk.model.Favourite; import com.madeinhk.model.Word; import com.madeinhk.utils.Analytics; public class DictionaryHeadService extends Service { private WindowManager mWindowManager; private View mDictionaryHead; private TextView mTextView; private Word mWord; private ToggleButton mFavButton; private Handler mHandler; private static final String KEY_WORD = "key_word"; @Override public IBinder onBind(Intent intent) { // Not used return null; } @Override public void onCreate() { super.onCreate(); mHandler = new Handler(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); Analytics.trackPopup(this); mWord = intent.getParcelableExtra(KEY_WORD); if (mDictionaryHead == null) { LayoutInflater inflate = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mDictionaryHead = inflate.inflate(R.layout.dictionary_head, null); mTextView = (TextView) mDictionaryHead.findViewById(R.id.message); mFavButton = (ToggleButton) mDictionaryHead.findViewById(R.id.fav_button); mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSLUCENT); params.windowAnimations = android.R.style.Animation_Toast; params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; params.x = 0; params.y = 100; mWindowManager.addView(mDictionaryHead, params); mDictionaryHead.setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY; private boolean mAlwaysInTapRegion = true; final ViewConfiguration configuration = ViewConfiguration.get(DictionaryHeadService.this); final int touchSlop = configuration.getScaledTouchSlop(); private int mTouchSlopSquare = touchSlop * touchSlop; @Override public boolean onTouch(View v, MotionEvent event) { restartDismissTimer(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); mAlwaysInTapRegion = true; return true; case MotionEvent.ACTION_UP: if (mAlwaysInTapRegion) { Intent intent = DictionaryActivity .getIntent(DictionaryHeadService.this, mWord.mWord); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); mHandler.removeCallbacksAndMessages(null); stopSelf(); } return true; case MotionEvent.ACTION_CANCEL: mAlwaysInTapRegion = false; case MotionEvent.ACTION_MOVE: final int deltaX = (int) (event.getRawX() - initialTouchX); final int deltaY = (int) (event.getRawY() - initialTouchY); final int distance = (deltaX * deltaX) + (deltaY * deltaY); if (distance > mTouchSlopSquare) { mAlwaysInTapRegion = false; } params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY - (int) (event.getRawY() - initialTouchY); mWindowManager.updateViewLayout(mDictionaryHead, params); return true; } return false; } }); } StringBuilder sb = new StringBuilder(); if (mWord.mDifficulty > 0) { sb.append(this.getString(R.string.word_frequency)).append(" "); int commonness = 5 - mWord.mDifficulty; for (int i = 0; i < 5; i++) { if (i <= commonness) { sb.append('★'); } else { sb.append('☆'); } } sb.append("\n"); } sb.append(mWord.buildMeaningSummary()); mTextView.setText(sb.toString()); final Favourite favourite = Favourite.fromWord(mWord); boolean alreadyMarked = favourite.isExists(this); mFavButton.setChecked(alreadyMarked); mFavButton.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { favourite.save(DictionaryHeadService.this); } else { favourite.delete(DictionaryHeadService.this); } } }); restartDismissTimer(); return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); removeView(); } private void restartDismissTimer() { mHandler.removeCallbacksAndMessages(null); mHandler.postDelayed(new Runnable() { @Override public void run() { stopSelf(); } }, 5000); } private void removeView() { if (mDictionaryHead != null) { mWindowManager.removeView(mDictionaryHead); } } public static void show(Context context, Word word) { Intent intent = new Intent(context, DictionaryHeadService.class); intent.putExtra(KEY_WORD, word); context.startService(intent); } }