package com.smartisanos.sidebar; import java.io.File; import java.net.URI; import smartisanos.app.SmartisanProgressDialog; import com.smartisanos.sidebar.util.SidebarItem; import com.smartisanos.sidebar.util.Utils; import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.DragEvent; import android.view.WindowManager; import android.widget.Toast; public class PendingDragEventTask { private static final int CHECK_GAP = 1000; private static final int MAX_TIMES = 20; private Context mContext; private DragEvent mPendingEvent; private SidebarItem mSidebarItem; private SmartisanProgressDialog mDialog; private Handler mHandler; private int mTimes = 0; public static boolean tryPending(Context context, DragEvent event, SidebarItem item) { if (isPendingData(event)) { new PendingDragEventTask(context, DragEvent.obtain(event), item) .start(); return true; } return false; } private PendingDragEventTask(Context context, DragEvent event, SidebarItem item) { mContext = context; mPendingEvent = event; mSidebarItem = item; mHandler = new Handler(Looper.getMainLooper()); } public void start() { if (mDialog != null && mDialog.isShowing()) { return; } IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); mContext.registerReceiver(mBroadcastReceiver, filter); mDialog = new SmartisanProgressDialog(mContext); mDialog.setMessage(R.string.pending_ongoing); mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mHandler.removeCallbacks(mCheckPending); } }); mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { showToast(R.string.pending_cancel); } }); mDialog.getWindow().setCloseOnTouchOutside(false); mDialog.getWindow().getAttributes().flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; mDialog.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; mDialog.getWindow().getAttributes().isEatHomeKey = true; mDialog.show(); mTimes = 0; mHandler.post(mCheckPending); } private static boolean isPendingData(DragEvent event) { ClipData cd = event.getClipData(); if (cd == null) { return false; } for (int i = 0; i < cd.getItemCount(); ++i) { Uri uri = cd.getItemAt(i).getUri(); if (uri != null && "file".equals(uri.getScheme())) { File file = new File(uri.getPath()); if (!file.exists()) { return true; } } } return false; } private void showToast(int resId) { Toast.makeText(mContext, resId, Toast.LENGTH_SHORT).show(); } private Runnable mCheckPending = new Runnable() { @Override public void run() { mTimes++; if (mTimes > MAX_TIMES) { mDialog.dismiss(); showToast(R.string.pending_fail); return; } if (!mDialog.isShowing()) { return; } if (!isPendingData(mPendingEvent)) { mDialog.dismiss(); mSidebarItem.handleDragEvent(mContext, mPendingEvent); } else { mHandler.postDelayed(mCheckPending, CHECK_GAP); } } }; private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { String reason = intent.getStringExtra("reason"); if ("eathomekey".equals(reason)) { mDialog.cancel(); mContext.unregisterReceiver(mBroadcastReceiver); } } } }; }