package info.papdt.pano.ui.activities; import android.app.Activity; import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.widget.Toast; import android.support.design.widget.FloatingActionButton; import java.util.List; import java.util.Map; import info.papdt.pano.R; import info.papdt.pano.processor.ScreenshotComposer; import info.papdt.pano.service.ScreenshotService; import info.papdt.pano.support.Settings; import info.papdt.pano.ui.fragments.TempSettingsFragment; import static info.papdt.pano.support.Utility.*; import static info.papdt.pano.ui.util.UiUtility.*; import static info.papdt.pano.BuildConfig.DEBUG; public class ScreenshotActivity extends ToolbarActivity { private static final String TAG = ScreenshotActivity.class.getSimpleName(); private Settings mSettings; private TempSettingsFragment mFragment; private List<String> mFiles; private FloatingActionButton mFAB; @Override protected int getLayoutResource() { return R.layout.screenshot; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mFAB = $(this, R.id.shot_fab); mFAB.setVisibility(View.GONE); mFAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new ScreenshotTask().execute(mFiles); } }); mSettings = Settings.getInstance(this); mFragment = new TempSettingsFragment(); // TODO Preview after composing, should be able to re-do final Intent i = new Intent(this, ScreenshotService.class); bindService(i, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { mFiles = ((ScreenshotService.ScreenshotBinder) binder).getFiles(); if (mFiles != null && mFiles.size() > 0) { getFragmentManager().beginTransaction().replace(R.id.frame, mFragment).commit(); mFAB.setVisibility(View.VISIBLE); } else { // If null? } unbindService(this); stopService(i); } @Override public void onServiceDisconnected(ComponentName name) { } }, 0); } private class ScreenshotTask extends AsyncTask<List<String>, String, String> { ProgressDialog prog; Map<String, Object> settings; int statusHeight; @Override protected void onPreExecute() { super.onPreExecute(); prog = new ProgressDialog(ScreenshotActivity.this); prog.setMessage(getString(R.string.plz_wait)); prog.setCancelable(false); prog.show(); settings = mFragment.getSettings(); statusHeight = getStatusBarHeight(ScreenshotActivity.this); } @Override protected String doInBackground(List<String>... params) { ScreenshotComposer composer = ScreenshotComposer.getInstance(); composer.setOutputDir((String) settings.get(Settings.OUTPUT_DIRECTORY)); composer.setThreshold(((int) settings.get(Settings.MATCHING_THRESHOLD)) * 2 / 100000.0f); composer.setStatusBarHeight(statusHeight); composer.setShadowHeight(dp2pxY(ScreenshotActivity.this, (int) settings.get(Settings.TOP_SHADOW_DEPTH))); try { return composer.compose(params[0].toArray(new String[params[0].size()]), new ScreenshotComposer.ProgressListener() { @Override public void onAnalyzingImage(int i, int j, int total) { publishProgress(String.format(getString(R.string.analyzing_image), i, j, total)); } @Override public void onComposingImage() { publishProgress(getString(R.string.composing_image)); } }); } catch (Exception e) { // TODO: Show the exact error if (DEBUG) { Log.e(TAG, Log.getStackTraceString(e)); } return null; } } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); prog.setMessage(values[0]); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null) { notifyMediaScanner(ScreenshotActivity.this, result); Toast.makeText( ScreenshotActivity.this, String.format(getString(R.string.saved), result), Toast.LENGTH_LONG).show(); mFAB.postDelayed(new Runnable() { @Override public void run() { prog.dismiss(); finish(); } }, 1000); } else { prog.dismiss(); Toast.makeText( ScreenshotActivity.this, getString(R.string.compose_failure), Toast.LENGTH_LONG).show(); } } } }