package com.konka.music.ui.fragment.downloadmanager;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.content.Loader;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.konka.music.R;
import com.konka.music.core.providers.DownloadManager;
import com.konka.music.core.providers.downloads.Downloads;
import com.konka.music.loader.DownLoadIngCursorLoader;
import com.konka.music.ui.fragment.downloadmanager.DownloadIngFragment.DownloadIngBaseAdapter.Holder;
import com.konka.music.util.Assist;
import com.konka.music.util.CreateViewUtil;
import com.konka.music.util.ViewUtility;
import com.kubeiwu.baseclass.loader.BaseLoaderCallbacksFragment;
public class DownloadIngFragment extends BaseLoaderCallbacksFragment<Cursor> implements OnClickListener, OnItemClickListener {
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = CreateViewUtil.onCreateView(inflater, container, savedInstanceState, rootView, R.layout.downloadingfragment_layout);
return rootView;
}
public static final int SUSPENDEDALL = 0;
public static final int STARTALL = 1;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add(Menu.NONE, SUSPENDEDALL, 0, "全部暂停").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(Menu.NONE, STARTALL, 0, "全部开始").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
private ListView listView;
private DownloadIngBaseAdapter downloadBaseAdapter;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
listView = ViewUtility.findViewById(view, R.id.downloadingfragment_listview);
listView.setOnItemClickListener(this);
}
@Override
protected void lazyLoad() {
mDownloadManager = new DownloadManager(getActivity().getContentResolver(), getActivity().getPackageName());
mDownloadManager.setAccessAllDownloads(true);
getLoaderManager().initLoader(Assist.DOWNLOADING_LOADER_ID, null, this);
};
DownloadManager mDownloadManager;
Cursor mDownloadingCursor;
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new DownLoadIngCursorLoader(getActivity(), mDownloadManager);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
super.onLoadFinished(arg0, arg1);
if (arg1 != null) {
mDownloadingCursor = arg1;
downloadBaseAdapter = new DownloadIngBaseAdapter(getActivity(), mDownloadingCursor, true);
mDownloadingCursor.setNotificationUri(getActivity().getContentResolver(), Downloads.CONTENT_URI);
listView.setAdapter(downloadBaseAdapter);
}
}
class DownloadIngBaseAdapter extends CursorAdapter {
Cursor cursor;
@Override
protected void onContentChanged() {
super.onContentChanged();
}
final private int mTitleColumnId;
final private int mStatusColumnId;
final private int mReasonColumnId;
final private int mTotalBytesColumnId;
final private int mCurrentBytesColumnId;
final private int mMediaTypeColumnId;
final private int mDateColumnId;
final private int mIdColumnId;
public DownloadIngBaseAdapter(Context context, Cursor cursor, boolean autoRequery) {
super(context, cursor, autoRequery);
this.cursor = cursor;
mIdColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_ID);
mTitleColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TITLE);
mStatusColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS);
mReasonColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON);
mTotalBytesColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
mCurrentBytesColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
mMediaTypeColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE);
mDateColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
bindViewData(view, context, cursor);
}
@Override
public View newView(Context context, Cursor mCursor, ViewGroup parent) {
View convertView = LayoutInflater.from(context).inflate(R.layout.downloading_child_item, parent, false);
return convertView;
}
private void bindViewData(View view, Context context, Cursor mCursor) {
final Holder holder = new Holder();
holder.download_progressbar = ViewUtility.findViewById(view, R.id.download_progressbar);
holder.download_state_image = ViewUtility.findViewById(view, R.id.download_state_image);
holder.download_intro = ViewUtility.findViewById(view, R.id.download_intro);
holder.download_title = ViewUtility.findViewById(view, R.id.download_title);
String title = mCursor.getString(mTitleColumnId);
long totalBytes = mCursor.getLong(mTotalBytesColumnId);
long currentBytes = mCursor.getLong(mCurrentBytesColumnId);
holder.status = mCursor.getInt(mStatusColumnId);
holder.mIdColumn = mCursor.getInt(mIdColumnId);
holder.download_delete_layout = ViewUtility.findViewById(view, R.id.download_delete_layout, new OnClickListener() {
@Override
public void onClick(View v) {
mDownloadManager.remove(holder.mIdColumn);
}
});
if (title.length() == 0) {
title = context.getString(R.string.missing_title);
}
holder.download_title.setText(title);
int progress = getProgressValue(totalBytes, currentBytes);
boolean indeterminate = holder.status == DownloadManager.STATUS_PENDING;
holder.download_progressbar.setIndeterminate(indeterminate);
if (!indeterminate) {
holder.download_progressbar.setProgress(progress);
}
if (holder.status == DownloadManager.STATUS_FAILED || holder.status == DownloadManager.STATUS_SUCCESSFUL) {
// holder.download_progressbar.setVisibility(View.GONE);
} else {
holder.download_progressbar.setVisibility(View.VISIBLE);
}
int stringid = getStatusStringResId(holder.status);
if (stringid != 0) {
holder.download_intro.setText(stringid);
} else {
String runningString=getSizeText(context, currentBytes) + "/" + (totalBytes>0?getSizeText(context, totalBytes):"未知");
holder.download_intro.setText(progress == 0 ? getString(R.string.download_the_wait) :runningString);
}
holder.download_state_image.setImageResource(getStatusImageResId(holder.status));
view.setTag(holder);
}
private String getSizeText(Context context, long totalBytes) {
String sizeText = "";
if (totalBytes >= 0) {
sizeText = Formatter.formatFileSize(context, totalBytes);
}
return sizeText.replace("B", "");
}
public int getProgressValue(long totalBytes, long currentBytes) {
if (totalBytes == -1) {
return 0;
}
return (int) (currentBytes * 100 / totalBytes);
}
class Holder {
ProgressBar download_progressbar;
ImageView download_state_image;
TextView download_intro;
TextView download_title;
View download_delete_layout;
int status;
int mIdColumn;
}
private int getStatusImageResId(int status) {
switch (status) {
case DownloadManager.STATUS_FAILED:
return R.drawable.btn_down_stop;
case DownloadManager.STATUS_SUCCESSFUL:
return R.drawable.btn_down_waitting;
case DownloadManager.STATUS_PENDING:
case DownloadManager.STATUS_RUNNING:
return R.drawable.btn_down_loading;
case DownloadManager.STATUS_PAUSED:
if (cursor.getInt(mReasonColumnId) == DownloadManager.PAUSED_QUEUED_FOR_WIFI) {
return R.drawable.btn_down_stop;
} else {
return R.drawable.btn_down_stop;
}
}
return R.drawable.btn_down_stop;
// throw new IllegalStateException("Unknown status: " + cursor.getInt(mStatusColumnId));
}
private int getStatusStringResId(int status) {
switch (status) {
case DownloadManager.STATUS_FAILED:
return R.string.click_to_redownload;
case DownloadManager.STATUS_PENDING:
return R.string.download_the_wait;
case DownloadManager.STATUS_RUNNING:
return 0;
case DownloadManager.STATUS_PAUSED:
if (cursor.getInt(mReasonColumnId) == DownloadManager.PAUSED_QUEUED_FOR_WIFI) {
return R.string.waiting_wifi;
} else {
return R.string.click_continue_to_download;
}
}
return 0;
}
}
@Override
public void onClick(View v) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object object = view.getTag();
handleItemClick(object);
}
private long lastTime = 0;
private int id = 0;
private final int INTERVALTIME = 1000;
@Override
public void onDestroyView() {
super.onDestroyView();
getLoaderManager().destroyLoader(Assist.DOWNLOADING_LOADER_ID);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
super.onLoaderReset(arg0);
}
private void handleItemClick(Object object) {
if (object != null && object instanceof Holder) {
synchronized (DownloadIngFragment.class) {
Holder holder = (Holder) object;
if (id == holder.mIdColumn) {
if (System.currentTimeMillis() - lastTime < INTERVALTIME) {
return;
}
}
id = holder.mIdColumn;
switch (holder.status) {
case DownloadManager.STATUS_FAILED:
case DownloadManager.STATUS_SUCCESSFUL:
mDownloadManager.restartDownload(holder.mIdColumn);
break;
case DownloadManager.STATUS_PAUSED:
mDownloadManager.resumeDownload(holder.mIdColumn);
break;
case DownloadManager.STATUS_RUNNING:
mDownloadManager.pauseDownload(holder.mIdColumn);
break;
default:
break;
}
}
lastTime = System.currentTimeMillis();
}
}
}