@Override
  public void onItemClick(View v, final int position, final AppInfo appInfo) {

    if (appInfo.getStatus() == AppInfo.STATUS_DOWNLOADING
        || appInfo.getStatus() == AppInfo.STATUS_CONNECTING) {
      if (isCurrentListViewItemVisible(position)) {
        DownloadManager.getInstance().pause(appInfo.getUrl());
      }
      return;
    } else if (appInfo.getStatus() == AppInfo.STATUS_COMPLETE) {
      if (isCurrentListViewItemVisible(position)) {
        Utils.installApp(getActivity(), new File(dir, appInfo.getName() + ".apk"));
      }
      return;
    } else if (appInfo.getStatus() == AppInfo.STATUS_INSTALLED) {
      if (isCurrentListViewItemVisible(position)) {
        Utils.unInstallApp(getActivity(), appInfo.getPackageName());
      }
    } else {
      download(position, appInfo);
    }
  }
  private void download(final int position, final AppInfo appInfo) {
    DownloadManager.getInstance()
        .download(
            appInfo.getName() + ".apk",
            appInfo.getUrl(),
            dir,
            new CallBack() {

              @Override
              public void onDownloadStart() {
                appInfo.setStatus(AppInfo.STATUS_CONNECTING);
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onConnected(long total, boolean isRangeSupport) {
                appInfo.setStatus(AppInfo.STATUS_DOWNLOADING);
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onProgress(long finished, long total, int progress) {
                String downloadPerSize = getDownloadPerSize(finished, total);
                appInfo.setProgress(progress);
                appInfo.setDownloadPerSize(downloadPerSize);
                appInfo.setStatus(AppInfo.STATUS_DOWNLOADING);
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvDownloadPerSize.setText(downloadPerSize);
                  holder.progressBar.setProgress(progress);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onComplete() {
                appInfo.setStatus(AppInfo.STATUS_COMPLETE);
                File apk = new File(dir, appInfo.getName() + ".apk");
                if (apk.isFile() && apk.exists()) {
                  String packageName = Utils.getApkFilePackage(getActivity(), apk);
                  appInfo.setPackageName(packageName);
                  if (Utils.isAppInstalled(getActivity(), packageName)) {
                    appInfo.setStatus(AppInfo.STATUS_INSTALLED);
                  }
                }

                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onDownloadPause() {
                appInfo.setStatus(AppInfo.STATUS_PAUSE);
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onDownloadCancel() {
                appInfo.setStatus(AppInfo.STATUS_NOT_DOWNLOAD);
                appInfo.setDownloadPerSize("");
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.tvDownloadPerSize.setText("");
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
              }

              @Override
              public void onFailure(DownloadException e) {
                appInfo.setStatus(AppInfo.STATUS_DOWNLOAD_ERROR);
                appInfo.setDownloadPerSize("");
                if (isCurrentListViewItemVisible(position)) {
                  ListViewAdapter.ViewHolder holder = getViewHolder(position);
                  holder.tvStatus.setText(appInfo.getStatusText());
                  holder.tvDownloadPerSize.setText("");
                  holder.btnDownload.setText(appInfo.getButtonText());
                }
                e.printStackTrace();
              }
            });
  }