package eu.tpmusielak.securephoto.verification; import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.view.ViewGroup; import android.widget.ImageView; import eu.tpmusielak.securephoto.R; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicInteger; /** * Created by IntelliJ IDEA. * User: Tomasz P. Musielak * Date: 26/03/12 * Time: 01:22 */ public abstract class VerifierWrapper { public static final int RESOURCE_ID_OFFSET = 37; public static AtomicInteger resourceOffset = new AtomicInteger(0); private boolean enabled = true; protected boolean registered = false; public final int iconID = RESOURCE_ID_OFFSET + resourceOffset.incrementAndGet(); protected Verifier verifier; protected VerifierGUIReceiver guiReceiver; protected Context context; ViewGroup pluginsPane; protected VerifierBinder verifierManager; InitializeVerifierTask initTask; Timer blinkingTimer; public void register(VerifierBinder m) { verifierManager = m; context = m.getApplicationContext(); verifierManager.register(this); registered = true; } public void setReceiver(VerifierGUIReceiver receiver) { this.guiReceiver = receiver; } @SuppressWarnings("unchecked") public void initializeWrapper() { initTask = new InitializeVerifierTask(); initTask.execute(); } public void bindToGUI() { pluginsPane = guiReceiver.getPluginsPane(); putIcon(); setStateColor(); } /** * Called after binding to camera GUI */ public void onCameraStart() { } public void onCameraExit() { } public void onDestroy() { } public Verifier getVerifier() { return verifier; } public String getName() { return verifier.toString(); } public Drawable getDrawable() { return context.getResources().getDrawable(R.drawable.ic_stat_padlock); } public int getPreferenceID() { return 0; // No default preferences defined. } public void setEnabled(boolean val) { enabled = val; } public boolean isEnabled() { return enabled; } private void putIcon() { guiReceiver.runOnUiThread(new Runnable() { @Override public void run() { ImageView imageView = new ImageView(guiReceiver.getBaseContext()); imageView.setImageDrawable(getDrawable()); imageView.setId(iconID); pluginsPane.addView(imageView); } }); } private void setIconColor(final int filter) { guiReceiver.runOnUiThread(new Runnable() { @Override public void run() { ((ImageView) guiReceiver.findViewById(iconID)) .setColorFilter(filter, PorterDuff.Mode.MULTIPLY); } }); } protected void startFlashingIcon() { blinkingTimer = new Timer(); blinkingTimer.schedule(new FlashIconTask(), 0, 1000); } protected void stopFlashingIcon() { try { blinkingTimer.cancel(); } catch (Exception e) { e.printStackTrace(); } } private boolean isBoundToGUI() { return guiReceiver != null; } protected void setStateColor() { switch (verifier.getState()) { case UNINITIALIZED: setIconColor(Color.GRAY); break; case INITIALIZING: setIconColor(Color.YELLOW); break; case INIT_SUCCESS: setIconColor(Color.GREEN); break; case INIT_FAILURE: setIconColor(Color.RED); break; } } protected class InitializeVerifierTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { if (isBoundToGUI()) { setIconColor(Color.YELLOW); guiReceiver.startBackgroundOperation(); } } @Override protected Void doInBackground(Void... voids) { verifier.initialize(); return null; } @Override protected void onPostExecute(Void aVoid) { if (isBoundToGUI()) { guiReceiver.endBackgroundOperation(); setStateColor(); } } } private class FlashIconTask extends TimerTask { @Override public void run() { try { setIconColor(Color.TRANSPARENT); Thread.sleep(500); setStateColor(); } catch (InterruptedException e) { e.printStackTrace(); } } } }