package ams.android.linkit.Service; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Shader; import android.os.Handler; import android.os.IBinder; import android.os.Vibrator; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import ams.android.linkit.Activity.MainActivity; import ams.android.linkit.R; import ams.android.linkit.Tools.GlobalApplication; import me.leolin.shortcutbadger.ShortcutBadgeException; import me.leolin.shortcutbadger.ShortcutBadger; /** * Created by Aidin on 2/2/2015. */ public class NotiHeadService extends Service { private WindowManager windowManager; View rootView = null; ImageView img = null; TextView txtTitle = null; RelativeLayout layoutInfo = null; Timer timer = new Timer(); ImageLoader imageLoader = ImageLoader.getInstance(); DisplayImageOptions options; ImageLoadingListener imageListener; Boolean isNotiCatched; @Override public IBinder onBind(Intent intent) { // Not used return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { final String imageUrl = (String) intent.getExtras().get("imageUrl"); final String linkSrceenShot = (String) intent.getExtras().get("linkSrceenShot"); final String productLink = (String) intent.getExtras().get("productLink"); final String text = (String) intent.getExtras().get("text"); isNotiCatched = false; Vibrator v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(500); options = new DisplayImageOptions.Builder() .showImageOnFail(R.drawable.ic_launcher) .showStubImage(R.drawable.ic_launcher) .showImageForEmptyUri(R.drawable.ic_launcher).cacheInMemory() .cacheOnDisc().build(); imageListener = new ImageDisplayListener(); if (!imageLoader.isInited()) { imageLoader.init(ImageLoaderConfiguration.createDefault(getApplicationContext())); } // badget number try { int count = ((GlobalApplication) getApplication()).getBadgeCount(); ShortcutBadger.setBadge(getApplicationContext(), count); ((GlobalApplication) getApplication()).setBadgetCount(count + 1); } catch (ShortcutBadgeException e) { //handle the Exception } LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); if (rootView == null) rootView = inflater.inflate(R.layout.noti_head, null); final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP; layoutInfo = (RelativeLayout) rootView.findViewById(R.id.lay_noti_text); //RelativeLayout layClick = (RelativeLayout)rootView.findViewById(R.id.lay_noti_main); img = (ImageView) rootView.findViewById(R.id.img_noti); txtTitle = (TextView) rootView.findViewById(R.id.txtNotiTitle); txtTitle.setOnTouchListener(new OnSwipeTouchListener(getApplicationContext()) { @Override public void onSwipeRight() { //Toast.makeText(getApplicationContext(), "Right", Toast.LENGTH_SHORT).show(); // new mainTask().run(); // timer.cancel(); } @Override public boolean onTouch(View v, MotionEvent event) { if (!isNotiCatched) { Intent myIntent = new Intent().setClass(NotiHeadService.this, MainActivity.class); myIntent.putExtra("RunByNoti", true); myIntent.putExtra("imageUrl", imageUrl); myIntent.putExtra("linkSrceenShot", linkSrceenShot); myIntent.putExtra("productLink", productLink); myIntent.putExtra("text", text); myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(myIntent); isNotiCatched = true; new mainTask().run(); timer.cancel(); } return super.onTouch(v, event); } }); txtTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); imageLoader = ImageLoader.getInstance(); imageLoader.displayImage(imageUrl, img, options, imageListener); txtTitle.setText(text); // Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.profile); //img.setImageBitmap(drawShadow(bm, 0, 0, 0)); // rootView.setOnTouchListener(new View.OnTouchListener() { // private int initialX; // private int initialY; // private float initialTouchX; // private float initialTouchY; // // @Override // public boolean onTouch(View v, MotionEvent event) { // //Toast.makeText(getApplicationContext(),"Touch",Toast.LENGTH_SHORT).show(); // // 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(rootView, params); // return true; // } // return false; // } // }); Animation animation = AnimationUtils.loadAnimation(getBaseContext(), R.anim.slide_in); animation.setStartOffset(0); Animation animation2 = AnimationUtils.loadAnimation(getBaseContext(), R.anim.slide_in); animation2.setStartOffset(250); img.startAnimation(animation); layoutInfo.startAnimation(animation2); windowManager.addView(rootView, params); timer.schedule(new mainTask(), 10000); handler = new Handler(); return START_STICKY; } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } Handler handler; private class mainTask extends TimerTask { public void run() { runOnUiThread( new Runnable() { @Override public void run() { Animation animation = AnimationUtils.loadAnimation(getBaseContext(), R.anim.slide_out); animation.setStartOffset(250); Animation animation2 = AnimationUtils.loadAnimation(getBaseContext(), R.anim.slide_out); animation2.setStartOffset(0); animation2.setFillAfter(true); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (rootView != null) windowManager.removeView(rootView); getApplicationContext().stopService(new Intent(getApplicationContext(), NotiHeadService.class)); } }); img.startAnimation(animation); layoutInfo.startAnimation(animation2); } }); // } } private void runOnUiThread(Runnable runnable) { handler.post(runnable); } private static class ImageDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections .synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } public static Bitmap drawShadow(Bitmap bitmap, int leftRightThk, int bottomThk, int padTop) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); int newW = w - (leftRightThk * 2); int newH = h - (bottomThk + padTop); Bitmap.Config conf = Bitmap.Config.ARGB_8888; Bitmap bmp = Bitmap.createBitmap(w, h, conf); Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, newW, newH, false); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Canvas c = new Canvas(bmp); // Left int leftMargin = (leftRightThk + 7) / 2; Shader lshader = new LinearGradient(0, 0, leftMargin, 0, Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP); paint.setShader(lshader); c.drawRect(0, padTop, leftMargin, newH, paint); // Right Shader rshader = new LinearGradient(w - leftMargin, 0, w, 0, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP); paint.setShader(rshader); c.drawRect(newW, padTop, w, newH, paint); // Bottom Shader bshader = new LinearGradient(0, newH, 0, bitmap.getHeight(), Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP); paint.setShader(bshader); c.drawRect(leftMargin - 3, newH, newW + leftMargin + 3, bitmap.getHeight(), paint); c.drawBitmap(sbmp, leftRightThk, 0, null); return bmp; } public class OnSwipeTouchListener implements View.OnTouchListener { private final GestureDetector gestureDetector; public OnSwipeTouchListener(Context context) { gestureDetector = new GestureDetector(context, new GestureListener()); } public void onSwipeLeft() { } public void onSwipeRight() { } public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } private final class GestureListener extends GestureDetector.SimpleOnGestureListener { private static final int SWIPE_DISTANCE_THRESHOLD = 100; private static final int SWIPE_VELOCITY_THRESHOLD = 100; @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (distanceX > 0) onSwipeRight(); else onSwipeLeft(); return true; } return false; } } } }