/* ThetaGalleryFragment Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.theta.fragment; import android.app.ActionBar; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v4.util.LruCache; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import org.deviceconnect.android.deviceplugin.theta.BuildConfig; import org.deviceconnect.android.deviceplugin.theta.R; import org.deviceconnect.android.deviceplugin.theta.ThetaDeviceApplication; import org.deviceconnect.android.deviceplugin.theta.activity.ThetaDeviceSettingsActivity; import org.deviceconnect.android.deviceplugin.theta.activity.ThetaFeatureActivity; import org.deviceconnect.android.deviceplugin.theta.core.ThetaDevice; import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceEventListener; import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceException; import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceManager; import org.deviceconnect.android.deviceplugin.theta.core.ThetaObject; import org.deviceconnect.android.deviceplugin.theta.data.ThetaObjectStorage; import org.deviceconnect.android.deviceplugin.theta.utils.DownloadThetaDataTask; import org.deviceconnect.android.deviceplugin.theta.view.ThetaLoadingProgressView; import org.deviceconnect.android.provider.FileManager; import java.util.ArrayList; import java.util.List; /** * THETA Device's Gallery Fragment. * * @author NTT DOCOMO, INC. */ public class ThetaGalleryFragment extends Fragment implements ThetaDeviceEventListener { /** Gallery Mode: App. */ private static final int GALLERY_MODE_APP = 0; /** Gallery Mode: Theta. */ private static final int GALLERY_MODE_THETA = 1; /** Gallery Command: data import. */ private static final int DIALOG_COMMAND_IMPORT = 0; /** Gallery Command: data delete. */ private static final int DIALOG_COMMAND_DELETE = 1; /** Gallery Mode Enable background. */ private static final int MODE_ENABLE_BACKGROUND = R.drawable.button_blue; /** Gallery Mode Disable background. */ private static final int MODE_DISABLE_BACKGROUND = R.drawable.button_white; /** Gallery Mode Enable text color. */ private static final int MODE_ENABLE_TEXT_COLOR = R.color.tab_text; /** Gallery Mode Disable text color. */ private static final int MODE_DISABLE_TEXT_COLOR = R.color.action_bar_background; /** * Theta's Gallery. */ private ThetaGalleryAdapter mGalleryAdapter; /** * Theta disconnect warning view. */ private RelativeLayout mRecconectLayout; /** * Theta status TextView. */ private TextView mStatusView; /** * Root View. */ private View mRootView; /** Move Shooting Fragment. */ private Button mShootingButton; /** * Download Task. */ private DownloadThetaDataTask mDownloadTask; /** * Progress. */ private ThetaDialogFragment mProgress; /** * Theta's data. */ private List<ThetaObject> mUpdateThetaList = new ArrayList<ThetaObject>(); /** * Theta's data in App's External Storage. */ private List<ThetaObject> mUpdateAppList = new ArrayList<ThetaObject>(); /** * Update Menu item. */ private MenuItem mUpdateItem; /** * Theta Device. */ private ThetaDevice mDevice; /** * Thumbnail cache. */ private LruCache<String, byte[]> mThumbnailCache; /** App/theta gallery mode flag. true:app false:theta*/ private boolean mIsGalleryMode = true; /** App/theta gallery mode change buttons.*/ private Button[] mGalleryModeButtons = new Button[2]; /** Control Storage of App*/ private ThetaObjectStorage mStorage; /** Storage Listener. */ private ThetaObjectStorage.Listener mStorageListener = new ThetaObjectStorage.Listener() { @Override public void onCompleted(final ThetaObjectStorage.DBMode mode, final long result) { mUpdateAppList = mStorage.geThetaObjectCaches(null); Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } if (mode == ThetaObjectStorage.DBMode.Add) { if (result > 0) { ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_data_import), null); } else { ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_error_import), null); } } List<ThetaObject> updateList = mUpdateAppList; if (!mIsGalleryMode) { updateList = mUpdateThetaList; } if (mGalleryAdapter != null) { mGalleryAdapter.clear(); mGalleryAdapter.addAll(updateList); mGalleryAdapter.notifyDataSetChanged(); } } }); } } }; /** Gallery Mode Change Listener. */ private View.OnClickListener mGalleryModeChangeListener = new View.OnClickListener() { @Override public void onClick(View view) { mGalleryModeButtons[GALLERY_MODE_APP].setEnabled(false); mGalleryModeButtons[GALLERY_MODE_THETA].setEnabled(false); if (mIsGalleryMode) { mIsGalleryMode = false; } else { mIsGalleryMode = true; } enableGalleryModeButtons(); List<ThetaObject> updateList = mUpdateAppList; if (mDevice != null && !mIsGalleryMode) { updateList = mUpdateThetaList; } else { enableOfflineView(); } if (updateList.size() == 0) { enableReconnectView(); } if (mGalleryAdapter != null) { mGalleryAdapter.clear(); mGalleryAdapter.addAll(updateList); mGalleryAdapter.notifyDataSetChanged(); } new Handler().postDelayed(new Runnable() { @Override public void run() { mGalleryModeButtons[GALLERY_MODE_APP].setEnabled(true); mGalleryModeButtons[GALLERY_MODE_THETA].setEnabled(true); } }, 500); } }; /** * Singleton. */ public static ThetaGalleryFragment newInstance(final ThetaDeviceManager deviceMgr) { ThetaGalleryFragment fragment = new ThetaGalleryFragment(); deviceMgr.registerDeviceEventListener(fragment); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); setHasOptionsMenu(true); initThetaObjectManagers(); mGalleryAdapter = new ThetaGalleryAdapter(getActivity(), new ArrayList<ThetaObject>()); } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { menu.clear(); // Add Menu Button mUpdateItem = menu.add(R.string.theta_update); if (mDevice != null) { mUpdateItem.setVisible(true); } else { mUpdateItem.setVisible(false); } mUpdateItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); mUpdateItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { if (item.getTitle().equals(mUpdateItem.getTitle())) { ShootingModeGetTask mode = new ShootingModeGetTask(); mDownloadTask = new DownloadThetaDataTask(); mDownloadTask.execute(mode); } return true; } }); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.theta_gallery, container, false); getActivity().getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME); ThetaDeviceApplication app = (ThetaDeviceApplication) getActivity().getApplication(); mThumbnailCache = app.getCache(); int color = R.color.action_bar_background; Drawable backgroundDrawable = getResources().getDrawable(color); getActivity().getActionBar().setBackgroundDrawable(backgroundDrawable); mRecconectLayout = (RelativeLayout) mRootView.findViewById(R.id.theta_reconnect_layout); mRootView.findViewById(R.id.theta_reconnect).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showSettingsActivity(); } }); mShootingButton = (Button) mRootView.findViewById(R.id.theta_shutter); mShootingButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra(ThetaFeatureActivity.FEATURE_MODE, ThetaFeatureActivity.MODE_SHOOTING); intent.setClass(getActivity(), ThetaFeatureActivity.class); startActivity(intent); } }); mStatusView = (TextView) mRootView.findViewById(R.id.theta_no_data); initListView(mRootView); initGalleryModeButtons(mRootView); return mRootView; } @Override public void onResume() { super.onResume(); enableGalleryModeButtons(); mProgress = null; enableReconnectView(); } @Override public void onPause() { super.onPause(); if (mProgress != null) { mProgress.dismiss(); mProgress = null; } } @Override public void onDestroy() { super.onDestroy(); if (mDownloadTask != null) { mDownloadTask.cancel(true); mDownloadTask = null; } } @Override public void onConnected(final ThetaDevice device) { Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { try { if (!mIsGalleryMode && mProgress == null) { mProgress = ThetaDialogFragment.newInstance(getString(R.string.theta_ssid_prefix), getString(R.string.loading)); mProgress.show(getActivity().getFragmentManager(), "fragment_dialog"); } enableReconnectView(); } catch (IllegalStateException e) { //Check background/foreground return; } } }); } } @Override public void onDisconnected(final ThetaDevice device) { mDevice = null; Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { if (!mIsGalleryMode && mGalleryAdapter != null) { mGalleryAdapter.clear(); mGalleryAdapter.notifyDataSetChanged(); } mUpdateThetaList.clear(); enableReconnectView(); } }); } } /** Enable App mode. State of App mode of view. */ private void enableOfflineView() { mRecconectLayout.setVisibility(View.GONE); getActivity().getActionBar().setTitle(getString(R.string.app_name)); if (mDevice == null) { mShootingButton.setVisibility(View.GONE); getActivity().getActionBar().setTitle(getString(R.string.app_name)); if (mUpdateItem != null) { mUpdateItem.setVisible(false); } if (!mIsGalleryMode && mGalleryAdapter != null) { mUpdateThetaList.clear(); mGalleryAdapter.clear(); mGalleryAdapter.notifyDataSetChanged(); mRecconectLayout.setVisibility(View.VISIBLE); } } else { getActivity().getActionBar().setTitle(mDevice.getName()); } } /** init Managers. */ private void initThetaObjectManagers() { if (getActivity() == null) { return; } ThetaDeviceApplication app = (ThetaDeviceApplication) getActivity().getApplication(); ThetaDeviceManager deviceMgr = app.getDeviceManager(); mStorage = new ThetaObjectStorage(getContext()); mStorage.setListener(mStorageListener); mDevice = deviceMgr.getConnectedDevice(); } /** init gallery mode change buttons. */ private void initGalleryModeButtons(final View rootView) { mGalleryModeButtons[GALLERY_MODE_APP] = (Button) rootView.findViewById(R.id.change_list_app); mGalleryModeButtons[GALLERY_MODE_APP].setOnClickListener(mGalleryModeChangeListener); mGalleryModeButtons[GALLERY_MODE_THETA] = (Button) rootView.findViewById(R.id.change_list_theta); mGalleryModeButtons[GALLERY_MODE_THETA].setOnClickListener(mGalleryModeChangeListener); } /** Enabled gallery mode buttons. */ private void enableGalleryModeButtons() { if (mIsGalleryMode) { mGalleryModeButtons[GALLERY_MODE_APP].setBackgroundResource(MODE_ENABLE_BACKGROUND); mGalleryModeButtons[GALLERY_MODE_APP].setTextColor(ContextCompat.getColor(getActivity(), MODE_ENABLE_TEXT_COLOR)); mGalleryModeButtons[GALLERY_MODE_THETA].setBackgroundResource(MODE_DISABLE_BACKGROUND); mGalleryModeButtons[GALLERY_MODE_THETA].setTextColor(ContextCompat.getColor(getActivity(), MODE_DISABLE_TEXT_COLOR)); } else { mGalleryModeButtons[GALLERY_MODE_APP].setBackgroundResource(MODE_DISABLE_BACKGROUND); mGalleryModeButtons[GALLERY_MODE_APP].setTextColor(ContextCompat.getColor(getActivity(), MODE_DISABLE_TEXT_COLOR)); mGalleryModeButtons[GALLERY_MODE_THETA].setBackgroundResource(MODE_ENABLE_BACKGROUND); mGalleryModeButtons[GALLERY_MODE_THETA].setTextColor(ContextCompat.getColor(getActivity(), MODE_ENABLE_TEXT_COLOR)); } } /** Enabled Reconnect View.*/ private void enableReconnectView() { initThetaObjectManagers(); mShootingButton.setVisibility(View.VISIBLE); if (mDevice != null && !mIsGalleryMode) { mShootingButton.setEnabled(true); mRecconectLayout.setVisibility(View.GONE); if (mUpdateItem != null) { mUpdateItem.setVisible(true); } String ssId = mDevice.getName(); getActivity().getActionBar().setTitle(ssId); if ((mRecconectLayout.isEnabled() && !mIsGalleryMode && mUpdateThetaList.size() == 0)) { if (mDownloadTask != null) { mDownloadTask.cancel(true); mDownloadTask = null; } ShootingModeGetTask mode = new ShootingModeGetTask(); mDownloadTask = new DownloadThetaDataTask(); mDownloadTask.execute(mode); } } else if (mDevice == null && !mIsGalleryMode) { if (mGalleryAdapter != null) { mUpdateThetaList.clear(); mGalleryAdapter.clear(); mGalleryAdapter.notifyDataSetChanged(); } mShootingButton.setEnabled(false); mRecconectLayout.setVisibility(View.VISIBLE); getActivity().getActionBar().setTitle(getString(R.string.app_name)); if (mUpdateItem != null) { mUpdateItem.setVisible(false); } } else { enableOfflineView(); if (mDownloadTask != null) { mDownloadTask.cancel(true); mDownloadTask = null; } if (mIsGalleryMode && mUpdateAppList.size() == 0) { ShootingModeGetTask mode = new ShootingModeGetTask(); mDownloadTask = new DownloadThetaDataTask(); mDownloadTask.execute(mode); } } } /** * ListView Initialize. * * @param rootView Root View */ private void initListView(final View rootView) { AbsListView list = (AbsListView) rootView.findViewById(R.id.theta_list); list.setAdapter(mGalleryAdapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(final AdapterView<?> adapterView, final View view, final int position, final long id) { if ((mIsGalleryMode && !mUpdateAppList.get(position).isImage()) || (!mIsGalleryMode && !mUpdateThetaList.get(position).isImage())) { ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_error_unsupported_movie), null); return; } Intent intent = new Intent(); intent.putExtra(ThetaFeatureActivity.FEATURE_MODE, ThetaFeatureActivity.MODE_VR); int index = -1; if (mUpdateThetaList.size() > 0) { index = mStorage.getThetaObjectCachesIndex(mUpdateThetaList.get(position).getFileName()); } if (!mIsGalleryMode && index != -1) { intent.putExtra(ThetaFeatureActivity.FEATURE_IS_STORAGE, !mIsGalleryMode); intent.putExtra(ThetaFeatureActivity.FEATURE_DATA, index); } else { intent.putExtra(ThetaFeatureActivity.FEATURE_IS_STORAGE, mIsGalleryMode); intent.putExtra(ThetaFeatureActivity.FEATURE_DATA, position); } intent.setClass(getActivity(), ThetaFeatureActivity.class); startActivity(intent); } }); list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(final AdapterView<?> adapterView, final View view, final int position, final long id) { if (!mIsGalleryMode && mUpdateThetaList.get(position).isImage() && !existThetaData(mUpdateThetaList.get(position))) { ThetaDialogFragment.showSelectCommandDialog(getActivity(), getResources().getStringArray(R.array.theta_gallery_command), new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialogInterface, final int pos) { FileManager fileManager = new FileManager(getActivity()); fileManager.checkWritePermission(new FileManager.CheckPermissionCallback() { @Override public void onSuccess() { if (pos == DIALOG_COMMAND_IMPORT) { Activity activity = getActivity(); if (activity != null && !ThetaObjectStorage.hasEnoughStorageSize()) { // Check Android Storage Limit activity.runOnUiThread(new Runnable() { @Override public void run() { ThetaDialogFragment.showAlert(getActivity(), getResources().getString(R.string.theta_ssid_prefix), getResources().getString(R.string.theta_error_import_shortage_by_android), null); } }); return; } exeImportData(position); } else { showRemoveConfirmDialog(position); } } @Override public void onFail() { Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { ThetaDialogFragment.showAlert(getActivity(), getResources().getString(R.string.theta_ssid_prefix), getResources().getString(R.string.theta_error_failed_save_file), null); } }); } } }); } }); } else { FileManager fileManager = new FileManager(getActivity()); fileManager.checkWritePermission(new FileManager.CheckPermissionCallback() { @Override public void onSuccess() { showRemoveConfirmDialog(position); } @Override public void onFail() { Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { ThetaDialogFragment.showAlert(getActivity(), getResources().getString(R.string.theta_ssid_prefix), getResources().getString(R.string.theta_error_failed_save_file), null); } }); } } }); } return true; } }); } /** already exist?.*/ private boolean existThetaData(final ThetaObject searchObj) { List<ThetaObject> obj = mStorage.geThetaObjectCaches(searchObj.getFileName()); return (obj.size() > 0); } /** Import data of Theta to storage of App. */ private void exeImportData(final int position) { Activity activity = getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { try { if (mProgress == null) { mProgress = ThetaDialogFragment.newInstance(getString(R.string.theta_ssid_prefix), getString(R.string.saving)); mProgress.show(getActivity().getFragmentManager(), "fragment_dialog"); } } catch (IllegalStateException e) { //background if (BuildConfig.DEBUG) { e.printStackTrace(); } } } }); } new Thread(new Runnable() { @Override public void run() { ThetaObject importObj = mUpdateThetaList.get(position); mStorage.addThetaObjectCache(importObj); } }).start(); } /* Show Remove Theta Object Confirm Dialog. */ private void showRemoveConfirmDialog(final int position) { String typeString = getString(R.string.theta_remove_data); ThetaObject removeObject = null; if (mIsGalleryMode) { removeObject = mUpdateAppList.get(position); } else { removeObject = mUpdateThetaList.get(position); } String[] mode = getResources().getStringArray(R.array.theta_shooting_mode); String type = mode[0]; if (!removeObject.isImage()) { type = mode[1]; } typeString = typeString.replace("$NAME$", type); ThetaDialogFragment.showConfirmAlert(getActivity(), getString(R.string.theta_ssid_prefix), typeString, getString(R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { RemoveThetaData removeObj = null; if (mDownloadTask != null) { mDownloadTask.cancel(true); mDownloadTask = null; } if (mIsGalleryMode) { removeObj = new RemoveThetaData(mUpdateAppList.remove(position)); } else { removeObj = new RemoveThetaData(mUpdateThetaList.remove(position)); } mDownloadTask = new DownloadThetaDataTask(); mDownloadTask.execute(removeObj); } }); } /** * Load Theta Datas. */ private void loadThetaData() { ThetaInfoTask info = new ThetaInfoTask(); mDownloadTask = new DownloadThetaDataTask(); mDownloadTask.execute(info); } /** Show Reconnection Dialog. */ private void showReconnectionDialog() { final Activity activity = getActivity(); if (activity != null) { ThetaDialogFragment.showReconnectionDialog(activity, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int i) { dialog.dismiss(); showSettingsActivity(); } }, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int i) { dialog.dismiss(); } }); } } /** Show Settings Activity. */ private void showSettingsActivity() { Activity activity = getActivity(); if (activity == null) { return; } Toast.makeText(activity, R.string.camera_must_connect, Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.setClass(activity, ThetaDeviceSettingsActivity.class); startActivity(intent); } /** * ThetaGalleryAdapter. */ private class ThetaGalleryAdapter extends ArrayAdapter<ThetaObject> { /** * LayoutInflater. */ private LayoutInflater mInflater; /** * Constructor. * * @param context Context. * @param objects ThetaGalleryList. */ public ThetaGalleryAdapter(final Context context, final List<ThetaObject> objects) { super(context, 0, objects); mInflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(final int position, final View convertView, final ViewGroup parent) { View cv = convertView; GalleryViewHolder holder; if (cv == null) { cv = mInflater.inflate(R.layout.theta_gallery_adapter, parent, false); holder = new GalleryViewHolder(cv); cv.setTag(holder); } else { holder = (GalleryViewHolder) cv.getTag(); } ThetaObject data = getItem(position); holder.mThumbnail.setImageResource(R.drawable.theta_gallery_thumb); holder.mThumbnail.setTag(data.getFileName()); holder.mLoading.setVisibility(View.VISIBLE); String dateString = data.getCreationTime(); holder.mDate.setText(dateString); if (data.isImage()) { holder.mType.setImageResource(R.drawable.theta_data_img); ThetaThumbTask thumbTask = new ThetaThumbTask(data, holder); DownloadThetaDataTask downloader = new DownloadThetaDataTask(); downloader.execute(thumbTask); } else { holder.mType.setImageResource(R.drawable.theta_data_mv); holder.mLoading.setVisibility(View.GONE); } return cv; } } /** * Gallery View Holder. */ private static class GalleryViewHolder { ImageView mThumbnail; ImageView mType; TextView mDate; ThetaLoadingProgressView mLoading; GalleryViewHolder(final View view) { mThumbnail = (ImageView) view.findViewById(R.id.theta_thumb_data); mType = (ImageView) view.findViewById(R.id.data_type); mDate = (TextView) view.findViewById(R.id.data_date); mLoading = (ThetaLoadingProgressView) view.findViewById(R.id.theta_thumb_progress); } } /** * Download of info. */ private class ThetaInfoTask implements DownloadThetaDataTask.ThetaDownloadListener { private int mError = -1; private List<ThetaObject> mResult = new ArrayList<ThetaObject>(); @Override public void doInBackground() { final Activity activity = getActivity(); if (activity == null) { return; } if (mProgress == null) { try { mProgress = ThetaDialogFragment.newInstance(getString(R.string.theta_ssid_prefix), getString(R.string.loading)); mProgress.show(getActivity().getFragmentManager(), "fragment_dialog"); } catch (IllegalStateException e) { return; } } try { if (mIsGalleryMode) { mResult = mStorage.geThetaObjectCaches(null); } else if (mDevice != null) { mResult = mDevice.fetchAllObjectList(); } } catch (ThetaDeviceException e) { e.printStackTrace(); mError = e.getReason(); } } @Override public void onPostExecute() { if (!mIsGalleryMode && mResult == null) { showSettingsActivity(); return; } if (mResult.size() > 0) { mStatusView.setVisibility(View.GONE); } else { mStatusView.setVisibility(View.VISIBLE); } if (mIsGalleryMode) { mUpdateAppList = mResult; } else { mUpdateThetaList = mResult; } if (mGalleryAdapter != null) { mGalleryAdapter.clear(); mGalleryAdapter.addAll(mResult); mGalleryAdapter.notifyDataSetChanged(); } try { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } } catch (IllegalStateException e) { //Check background/foreground return; } if (mError > 0) { showReconnectionDialog(); } } } /** * Donwload of thumb. */ private class ThetaThumbTask implements DownloadThetaDataTask.ThetaDownloadListener { /** THETA Object. */ private final ThetaObject mObj; /** View holder. */ private final GalleryViewHolder mHolder; /** Tag of thumbnail view. */ private final String mTag; /** Thumbnail. */ private byte[] mThumbnail; /** * Constructor. * @param obj THETA Object * @param holder view holder */ ThetaThumbTask(final ThetaObject obj, final GalleryViewHolder holder) { mObj = obj; mHolder = holder; mTag = holder.mThumbnail.getTag().toString(); } @Override public synchronized void doInBackground() { mThumbnail = mThumbnailCache.get(mObj.getFileName()); if (mThumbnail == null) { try { Thread.sleep(100); cacheThumbnail(mObj); } catch (ThetaDeviceException e) { if (BuildConfig.DEBUG) { Log.e("AAA", "error", e); } } catch (InterruptedException e) { // Nothing to do. } } } private void cacheThumbnail(final ThetaObject obj) throws ThetaDeviceException { obj.fetch(ThetaObject.DataType.THUMBNAIL); mThumbnail = obj.getThumbnailData(); obj.clear(ThetaObject.DataType.THUMBNAIL); } @Override public synchronized void onPostExecute() { ImageView thumbView = mHolder.mThumbnail; ThetaLoadingProgressView loadingView = mHolder.mLoading; if (!mTag.equals(thumbView.getTag())) { return; } if (mThumbnail != null) { mThumbnailCache.put(mObj.getFileName(), mThumbnail); thumbView = mHolder.mThumbnail; loadingView = mHolder.mLoading; if (mTag.equals(thumbView.getTag())) { Bitmap data = BitmapFactory.decodeByteArray(mThumbnail, 0, mThumbnail.length); thumbView.setImageBitmap(data); loadingView.setVisibility(View.GONE); } } loadingView.setVisibility(View.GONE); if ((mUpdateThetaList.size() > 0 && !mIsGalleryMode) || (mUpdateAppList.size() > 0 && mIsGalleryMode)) { mStatusView.setVisibility(View.GONE); } else { mStatusView.setVisibility(View.VISIBLE); } } } /** * Remove Theta data. */ private class RemoveThetaData implements DownloadThetaDataTask.ThetaDownloadListener { /** * Remove Theta data. */ private ThetaObject mRemoveObject; /** * isSuccess. */ private boolean mIsSuccess; RemoveThetaData(final ThetaObject removeObject) { mRemoveObject = removeObject; mIsSuccess = true; } @Override public synchronized void doInBackground() { try { mRemoveObject.remove(); } catch (ThetaDeviceException e) { mIsSuccess = false; } } @Override public synchronized void onPostExecute() { if (mIsSuccess) { ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_remove), null); } else { ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_error_failed_delete), null); } List<ThetaObject> removedList = mUpdateAppList; if (!mIsGalleryMode) { removedList = mUpdateThetaList; } if (mGalleryAdapter != null) { mGalleryAdapter.clear(); mGalleryAdapter.addAll(removedList); mGalleryAdapter.notifyDataSetChanged(); } if (removedList.size() > 0) { mStatusView.setVisibility(View.GONE); } else { mStatusView.setVisibility(View.VISIBLE); } } } /** Get Shooting Mode Task. */ private class ShootingModeGetTask implements DownloadThetaDataTask.ThetaDownloadListener { /** * Shooting mode. */ private ThetaDevice.ShootingMode mNowShootingMode; /** * Constructor. */ ShootingModeGetTask() { mNowShootingMode = ThetaDevice.ShootingMode.UNKNOWN; if (mProgress == null) { try { mProgress = ThetaDialogFragment.newInstance(getString(R.string.theta_ssid_prefix), getString(R.string.loading)); mProgress.show(getActivity().getFragmentManager(), "fragment_dialog"); } catch (IllegalStateException e) { //Check background/foreground return; } } } @Override public void doInBackground() { if (mDevice == null) { return; } try { mNowShootingMode = mDevice.getShootingMode(); } catch (ThetaDeviceException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } mNowShootingMode = ThetaDevice.ShootingMode.UNKNOWN; } } @Override public void onPostExecute() { if (mNowShootingMode == ThetaDevice.ShootingMode.LIVE_STREAMING) { if (mProgress != null) { try { mProgress.dismiss(); mProgress = null; ThetaDialogFragment.showAlert(getActivity(), getString(R.string.theta_ssid_prefix), getString(R.string.theta_error_usb_live_streaming), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { showReconnectionDialog(); } }); } catch (IllegalStateException e) { //Check background/foreground return; } } } else { loadThetaData(); } } } }