package com.android.pc.ioc.update; import java.io.File; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.widget.RemoteViews; import com.android.pc.ioc.app.Ioc; public class NotificationHelper { private Context mContext; private RemoteViews mRemoteViews; private Notification mDownProgrNotif; private PackageHelper mPackageHelper; private NotificationManager mContextNotificationManager; private int layout_id; private int icon_id; private int progress_id; private int progress_txt_id; private int id; private Class clazz; public NotificationHelper(Context ctx, int layout_id, int icon_id, int progress_id, int progress_txt_id, Class clazz) { this.mContext = ctx; this.mPackageHelper = new PackageHelper(); this.mContextNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); this.layout_id = layout_id; this.icon_id = icon_id; this.progress_id = progress_id; this.progress_txt_id = progress_txt_id; this.clazz = clazz; id = Integer.valueOf((System.currentTimeMillis() + "").substring(4)); } public void initNotif() { mDownProgrNotif = new Notification(); mDownProgrNotif.icon = android.R.drawable.stat_sys_download; mDownProgrNotif.flags |= Notification.FLAG_ONGOING_EVENT; mRemoteViews = new RemoteViews(mPackageHelper.getPackageName(), layout_id); mRemoteViews.setImageViewResource(icon_id, mPackageHelper.getAppIcon()); mDownProgrNotif.contentView = mRemoteViews; Intent intent = null; if (clazz != null) { intent = new Intent(Ioc.getIoc().getApplication(), clazz); } mDownProgrNotif.contentIntent = PendingIntent.getService(mContext, 0, intent == null ? new Intent() : intent, 0); // mContextNotificationManager.notify(id, mDownProgrNotif); } private Notification getDownFinishedNotification(File file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); Notification noti = new Notification(); noti.setLatestEventInfo(mContext, mPackageHelper.getAppName(), "下载完成,点击安装", pendingIntent); noti.icon = android.R.drawable.stat_sys_download_done; noti.flags = Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS; return noti; } /** * 下载成功或者失败以后 刷新顶部通知栏 * * @author gdpancheng@gmail.com 2014-3-2 下午11:33:43 * @return Notification */ public void downShowNotification(String text) { Intent intent = new Intent(); if (clazz != null) { intent = new Intent(Ioc.getIoc().getApplication(), clazz); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); } PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); Notification noti = new Notification(); noti.setLatestEventInfo(mContext, mPackageHelper.getAppName(), text, pendingIntent); noti.icon = android.R.drawable.stat_sys_download_done; noti.flags = Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS; mContextNotificationManager.notify(id, noti); } /** * 下载中 这个是不支持断点下载的 所以无法显示进度 * * @author gdpancheng@gmail.com 2014-3-2 下午11:33:43 * @return Notification */ public void downNotification(String text) { Notification notfi = new Notification(); notfi.icon = android.R.drawable.stat_sys_download; notfi.flags |= Notification.FLAG_ONGOING_EVENT; Intent intent = null; if (clazz != null) { intent = new Intent(Ioc.getIoc().getApplication(), clazz); } PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, intent == null ? new Intent() : intent, 0); notfi.setLatestEventInfo(mContext, mPackageHelper.getAppName(), text, pendingIntent); mContextNotificationManager.notify(id, notfi); } public void cancel() { mContextNotificationManager.cancel(id); } /** * 更新下载进度 * * @param percent */ public void refreshProgress(float percent) { mRemoteViews.setProgressBar(progress_id, 100, (int) percent, false); mRemoteViews.setTextViewText(progress_txt_id, String.format("%.1f", percent)); mContextNotificationManager.notify(id, mDownProgrNotif); } /** * 通知用户下载已经完成 * * @param file */ public void notifyUpdateFinish(File file) { mContextNotificationManager.notify(id, getDownFinishedNotification(file)); } class PackageHelper { private PackageInfo info = null; private PackageManager pm; public PackageHelper() { pm = Ioc.getIoc().getApplication().getPackageManager(); try { info = pm.getPackageInfo(Ioc.getIoc().getApplication().getPackageName(), 0); } catch (NameNotFoundException e) { e.printStackTrace(); } } public String getAppName() { return info != null ? (String) info.applicationInfo.loadLabel(pm) : ""; } public String getPackageName() { return info != null ? info.packageName : ""; } public int getAppIcon() { return info != null ? info.applicationInfo.icon : android.R.drawable.ic_dialog_info; } } }