package com.quran.labs.androidquran.ui; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.ActionBar; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.quran.labs.androidquran.QuranApplication; import com.quran.labs.androidquran.R; import com.quran.labs.androidquran.common.QariItem; import com.quran.labs.androidquran.data.SuraAyah; import com.quran.labs.androidquran.service.QuranDownloadService; import com.quran.labs.androidquran.service.util.DefaultDownloadReceiver; import com.quran.labs.androidquran.service.util.QuranDownloadNotifier; import com.quran.labs.androidquran.service.util.ServiceIntentHelper; import com.quran.labs.androidquran.util.AudioManagerUtils; import com.quran.labs.androidquran.util.AudioUtils; import com.quran.labs.androidquran.util.QariDownloadInfo; import com.quran.labs.androidquran.util.QuranFileUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.observers.DisposableSingleObserver; public class AudioManagerActivity extends QuranActionBarActivity implements DefaultDownloadReceiver.SimpleDownloadListener { private static final String AUDIO_DOWNLOAD_KEY = "AudioManager.DownloadKey"; private ProgressBar progressBar; private Disposable disposable; private ShuyookhAdapter shuyookhAdapter; private RecyclerView recyclerView; private DefaultDownloadReceiver downloadReceiver; private String basePath; private List<QariItem> qariItems; @Override protected void onCreate(Bundle savedInstanceState) { QuranApplication quranApp = (QuranApplication) getApplication(); quranApp.refreshLocale(this, false); super.onCreate(savedInstanceState); final ActionBar ab = getSupportActionBar(); if (ab != null) { ab.setTitle(R.string.audio_manager); ab.setDisplayHomeAsUpEnabled(true); } setContentView(R.layout.audio_manager); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setItemAnimator(new DefaultItemAnimator()); qariItems = AudioUtils.getQariList(this); shuyookhAdapter = new ShuyookhAdapter(qariItems); recyclerView.setAdapter(shuyookhAdapter); progressBar = (ProgressBar) findViewById(R.id.progress); basePath = QuranFileUtils.getQuranAudioDirectory(this); getShuyookhData(); } private void getShuyookhData() { if (disposable != null) { disposable.dispose(); } disposable = AudioManagerUtils.shuyookhDownloadObservable(basePath, qariItems) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(mOnDownloadInfo); } @Override protected void onResume() { super.onResume(); downloadReceiver = new DefaultDownloadReceiver(this, QuranDownloadService.DOWNLOAD_TYPE_AUDIO); downloadReceiver.setCanCancelDownload(true); LocalBroadcastManager.getInstance(this).registerReceiver(downloadReceiver, new IntentFilter(QuranDownloadNotifier.ProgressIntent.INTENT_NAME)); downloadReceiver.setListener(this); } @Override protected void onPause() { downloadReceiver.setListener(null); LocalBroadcastManager.getInstance(this).unregisterReceiver(downloadReceiver); super.onPause(); } @Override protected void onDestroy() { disposable.dispose(); super.onDestroy(); } private DisposableSingleObserver<List<QariDownloadInfo>> mOnDownloadInfo = new DisposableSingleObserver<List<QariDownloadInfo>>() { @Override public void onSuccess(List<QariDownloadInfo> downloadInfo) { progressBar.setVisibility(View.GONE); shuyookhAdapter.setDownloadInfo(downloadInfo); shuyookhAdapter.notifyDataSetChanged(); } @Override public void onError(Throwable e) { } }; private View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int position = recyclerView.getChildAdapterPosition(v); if (position != RecyclerView.NO_POSITION) { QariDownloadInfo info = shuyookhAdapter.getSheikhInfoForPosition(position); if (info.downloadedSuras.size() != 114) { download(qariItems.get(position)); } } } }; private void download(QariItem qariItem) { String baseUri = basePath + qariItem.getPath(); boolean isGapless = qariItem.isGapless(); String sheikhName = qariItem.getName(); Intent intent = ServiceIntentHelper.getDownloadIntent(this, AudioUtils.getQariUrl(qariItem), baseUri, sheikhName, AUDIO_DOWNLOAD_KEY, QuranDownloadService.DOWNLOAD_TYPE_AUDIO); intent.putExtra(QuranDownloadService.EXTRA_START_VERSE, new SuraAyah(1, 1)); intent.putExtra(QuranDownloadService.EXTRA_END_VERSE, new SuraAyah(114, 6)); intent.putExtra(QuranDownloadService.EXTRA_IS_GAPLESS, isGapless); startService(intent); AudioManagerUtils.clearCacheKeyForSheikh(qariItem); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } @Override public void handleDownloadSuccess() { getShuyookhData(); } @Override public void handleDownloadFailure(int errId) { getShuyookhData(); } private class ShuyookhAdapter extends RecyclerView.Adapter<SheikhViewHolder> { private final LayoutInflater mInflater; private final List<QariItem> mQariItems; private final Map<QariItem, QariDownloadInfo> mDownloadInfoMap; ShuyookhAdapter(List<QariItem> items) { mQariItems = items; mDownloadInfoMap = new HashMap<>(); mInflater = LayoutInflater.from(AudioManagerActivity.this); } void setDownloadInfo(List<QariDownloadInfo> downloadInfo) { for (QariDownloadInfo info : downloadInfo) { mDownloadInfoMap.put(info.qariItem, info); } } @Override public SheikhViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new SheikhViewHolder(mInflater.inflate(R.layout.audio_manager_row, parent, false)); } @Override public void onBindViewHolder(SheikhViewHolder holder, int position) { holder.name.setText(mQariItems.get(position).getName()); QariDownloadInfo info = getSheikhInfoForPosition(position); int fullyDownloaded = info.downloadedSuras.size(); holder.quantity.setText( getResources().getQuantityString(R.plurals.files_downloaded, fullyDownloaded, fullyDownloaded)); } QariDownloadInfo getSheikhInfoForPosition(int position) { return mDownloadInfoMap.get(mQariItems.get(position)); } @Override public int getItemCount() { return mDownloadInfoMap.size() == 0 ? 0 : mQariItems.size(); } } private class SheikhViewHolder extends RecyclerView.ViewHolder { public final TextView name; public final TextView quantity; public final ImageView image; SheikhViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.name); quantity = (TextView) itemView.findViewById(R.id.quantity); image = (ImageView) itemView.findViewById(R.id.image); itemView.setOnClickListener(mOnClickListener); } } }