Friday, January 17, 2014

Re: [android-developers] Best solution for touchable Toast-like notification for plugin library

Here's a bit of code I've been playing with that may give you some inspiration:

package com.example.floatingwindowtest;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

public class FloatingWindowService extends Service {
     
        protected boolean foreground = false;
        protected boolean cancelNotification = false;
        private Notification notification;
        private View myView;
        protected int id = 0;
        private WindowManager wm;
        private WindowManager.LayoutParams params;
       
        private int Xdown, Xstart;
        private int Ydown, Ystart;
       
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        @Override
        public void onCreate() {
            super.onCreate();
           // System.exit(0);
            Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_SHORT).show();
            params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
            params.gravity=Gravity.TOP|Gravity.LEFT;
        wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        final int size = (int) ((double)dm.heightPixels/2.5);
        params.x = (dm.widthPixels-size)/2;
        params.y = (dm.heightPixels-size)/2;
        params.height = size; 
        params.width = size;
 

        inflateview();
        foregroundNotification(1);
        //moveToForeground(1,n,true);
        }    
       @Override
        public void onDestroy() {
            super.onDestroy();
            ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).cancel(0);
            Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_SHORT).show();
            if(myView != null)
            {
                ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(myView);
                myView = null;
            }
        }
        protected Notification foregroundNotification(int notificationId)
       {   
        notification = new Notification(R.drawable.ic_launcher, "my Notification", System.currentTimeMillis());   
            notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_ONLY_ALERT_ONCE;  
            notification.setLatestEventInfo(this, "my Notification", "my Notification", notificationIntent());         
            ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(id, notification);           
            return notification;
        }
        private PendingIntent notificationIntent() {
            Intent intent = new Intent(this, MainActivity.class);   
            PendingIntent pending = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);   
            return pending;
        }
        public void inflateview()
        {
             LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                myView = inflater.inflate(R.layout.activity_popup, null);
                myView.setOnTouchListener(new View.OnTouchListener() {
                   public boolean onTouch(View v, MotionEvent event) {
                       switch (event.getAction()) {
                       case MotionEvent.ACTION_DOWN:
//                           Toast.makeText(getBaseContext(),"ACTION_DOWN", Toast.LENGTH_SHORT).show();
                              Xdown=(int) event.getRawX();
                             Ydown=(int) event.getRawY();
                             Xstart= params.x;
                             Ystart= params.y;
                              break;
                       case MotionEvent.ACTION_UP:
//                           Toast.makeText(getBaseContext(),"ACTION_UP", Toast.LENGTH_SHORT).show();
                              break;
                       case MotionEvent.ACTION_MOVE:
                              int x_cord = (int) event.getRawX();
                              int y_cord = (int) event.getRawY();
                             
                              int x_movement=x_cord-Xdown;
                              int y_movement=y_cord-Ydown;
                             
                              params.x=Xstart+x_movement;
                              params.y=Ystart+y_movement;
                             
                              myView.setLayoutParams(params);
                              FloatingWindowService.this.wm.updateViewLayout(myView, params);
                              break;
                       default:
                              break;
                       }
                       return true;
                   }
                 });
               
                final Button OKButton = (Button) myView.findViewById(R.id.OK_Button);
                OKButton.setOnClickListener(new View.OnClickListener() {
                   
                    public void onClick(View v) {
                        FloatingWindowService.this.stopSelf();
                    }
                });
               
           //     Drawable MyBG =  Drawable.createFromPath("content://media/external/images/media/100741");
           //     myView.setBackground(MyBG);
               
                // Add layout to window manager
                wm.addView(myView, params);
        }
   
}

You need the permission <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>


Just add the appropriate layout file and if desired make it more like a toast by adding a timer to automatically dismiss it after so many seconds. 



On Fri, Jan 17, 2014 at 9:44 PM, Glenn Powell <glennpow@gmail.com> wrote:
We are building a plugin library, which will be integrated into third-party applications.  It requires the ability to show Toast-like notifications, which when tapped, will open our fullscreen widget Dialog.

From my research it appears that Toasts were designed to explicitly ignore any touch input.  The next best option seems to be one of either a PopupWindow, a Fragment, another Dialog with a transparent background, or about 25 different solutions.  We don't want to trap touches on the entire screen, only over our notification popup.

I am new to Android, so I'm curious to learn what the optimal solution would be.  I have seen other plugin integrations do similar things, so I think there is probably an obvious way to tackle this.  If you've implemented something like this, can you please give us some pointers?  Thanks.

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups "Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups "Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate