package org.witness.informacam.ui;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.spongycastle.openpgp.PGPException;
import org.witness.informacam.InformaCam;
import org.witness.informacam.R;
import org.witness.informacam.json.JSONException;
import org.witness.informacam.json.JSONObject;
import org.witness.informacam.json.JSONTokener;
import org.witness.informacam.models.notifications.INotification;
import org.witness.informacam.models.organizations.IOrganization;
import org.witness.informacam.models.transport.ITransportStub;
import org.witness.informacam.transport.TransportUtility;
import org.witness.informacam.ui.screens.WizardStepOne;
import org.witness.informacam.ui.screens.WizardStepThree;
import org.witness.informacam.ui.screens.WizardStepTwo;
import org.witness.informacam.ui.screens.WizardStepZero;
import org.witness.informacam.ui.screens.WizardSubFragmentFinish;
import org.witness.informacam.utils.Constants.App;
import org.witness.informacam.utils.Constants.App.Storage;
import org.witness.informacam.utils.Constants.App.Storage.Type;
import org.witness.informacam.utils.Constants.Codes;
import org.witness.informacam.utils.Constants.InformaCamEventListener;
import org.witness.informacam.utils.Constants.Models;
import org.witness.informacam.utils.Constants.Models.IMedia.MimeType;
import org.witness.informacam.utils.Constants.Models.IUser;
import org.witness.informacam.utils.Constants.WizardListener;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TabHost;
import android.widget.TextView;
public class WizardActivity extends FragmentActivity implements WizardListener, InformaCamEventListener {
Intent init;
private final static String LOG = App.LOG;
TabHost tabHost;
ViewPager viewPager;
TabPager pager;
List<Fragment> fragments = new Vector<Fragment>();
public List<Fragment> subFragments = null;
boolean mainWizardCanContinue = false;
boolean subWizardCanContinue = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((InformaCam)getApplication()).setEventListener(this);
setContentView(R.layout.activity_wizard);
if(getIntent().hasExtra(Codes.Extras.SET_LOCALES)) {
Bundle locales = new Bundle();
locales.putSerializable(Codes.Extras.SET_LOCALES, getIntent().getSerializableExtra(Codes.Extras.SET_LOCALES));
locales.putString(Codes.Extras.LOCALE_PREF_KEY, getIntent().getStringExtra(Codes.Extras.LOCALE_PREF_KEY));
fragments.add(Fragment.instantiate(this, WizardStepZero.class.getName(), locales));
}
fragments.add(Fragment.instantiate(this, WizardStepOne.class.getName()));
fragments.add(Fragment.instantiate(this, WizardStepTwo.class.getName()));
fragments.add(Fragment.instantiate(this, WizardStepThree.class.getName()));
viewPager = (ViewPager) findViewById(R.id.view_pager_root);
if(getIntent().hasExtra(Codes.Extras.WIZARD_SUPPLEMENT)) {
subFragments = new Vector<Fragment>();
for(String f : getIntent().getStringArrayListExtra(Codes.Extras.WIZARD_SUPPLEMENT)) {
subFragments.add(Fragment.instantiate(this, f));
}
subFragments.add(Fragment.instantiate(this, WizardSubFragmentFinish.class.getName()));
}
initLayout();
}
@Override
public void onResume() {
super.onResume();
try {
for(String s : InformaCam.getInstance().getAssets().list("includedOrganizations")) {
Log.d(LOG, "NEW ASSET: " + s);
}
} catch(IOException e) {
Log.e(LOG, e.toString());
e.printStackTrace();
}
}
public void initLayout() {
pager = new TabPager(getSupportFragmentManager());
tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
tabHost.setOnTabChangedListener(pager);
viewPager.setAdapter(pager);
viewPager.setOnPageChangeListener(pager);
viewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
TabHost.TabSpec tabSpec = null;
@SuppressWarnings("unused")
View indicator = null;
int i = 1;
for(Fragment f : fragments) {
tabSpec = tabHost.newTabSpec(f.getClass().getSimpleName())
.setIndicator(indicator = new Indicator(String.valueOf(i), this).tab)
.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
View view = new View(WizardActivity.this);
view.setMinimumHeight(0);
view.setMinimumWidth(0);
return view;
}
});
tabHost.addTab(tabSpec);
i++;
}
if(getIntent().hasExtra(Codes.Extras.CHANGE_LOCALE)) {
getIntent().removeExtra(Codes.Extras.CHANGE_LOCALE);
viewPager.setCurrentItem(1);
}
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
}
public static class Indicator {
View tab;
Indicator(String label_string, Context c) {
tab = LayoutInflater.from(c).inflate(R.layout.tab_layout_wizard, null);
TextView label = (TextView) tab.findViewById(R.id.tab_label);
label.setText(label_string);
}
}
class TabPager extends FragmentStatePagerAdapter implements TabHost.OnTabChangeListener, OnPageChangeListener {
public TabPager(FragmentManager fm) {
super(fm);
}
@Override
public void onTabChanged(String tabId) {}
@Override
public void onPageScrollStateChanged(int state) {}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}
@Override
public void onPageSelected(int page) {
tabHost.setCurrentTab(page);
Log.d(LOG, "setting current page as " + page);
}
@Override
public Fragment getItem(int which) {
return fragments.get(which);
}
@Override
public int getCount() {
return fragments.size();
}
}
@Override
public FragmentManager returnFragmentManager() {
return getSupportFragmentManager();
}
@Override
public void wizardCompleted() {
// save everything and finish
InformaCam informaCam = (InformaCam)getApplication();
informaCam.user.hasCompletedWizard = true;
informaCam.user.lastLogIn = System.currentTimeMillis();
informaCam.user.isLoggedIn = true;
informaCam.saveState(informaCam.user);
informaCam.saveState(informaCam.languageMap);
try
{
informaCam.initData();
}
catch (Exception re)
{
throw new RuntimeException("Could not init data",re);
}
try {
for(String s : informaCam.getAssets().list("includedOrganizations")) {
InputStream ictdIS = informaCam.ioService.getStream("includedOrganizations/" + s, Type.APPLICATION_ASSET);
byte[] ictdBytes = new byte[ictdIS.available()];
ictdIS.read(ictdBytes);
IOrganization organization = informaCam.installICTD((JSONObject) new JSONTokener(new String(ictdBytes)).nextValue(), null, this);
if(organization != null && !informaCam.user.isInOfflineMode) {
INotification notification = new INotification(getResources().getString(R.string.key_sent), getResources().getString(R.string.you_have_sent_your_credentials_to_x, organization.organizationName), Models.INotification.Type.NEW_KEY);
notification.taskComplete = false;
informaCam.addNotification(notification, null);
ITransportStub transportStub = new ITransportStub(organization, notification);
transportStub.setAsset(IUser.PUBLIC_CREDENTIALS, IUser.PUBLIC_CREDENTIALS, MimeType.ZIP, Storage.Type.IOCIPHER);
transportStub.callbackCode = Models.ITransportStub.CallbackCodes.UPDATE_ORGANIZATION_HAS_KEY;
TransportUtility.initTransport(transportStub);
}
}
} catch(IOException e) {
Log.e(LOG, e.toString());
e.printStackTrace();
} catch (JSONException e) {
Log.e(LOG, e.toString());
e.printStackTrace();
}
if (getIntent().getExtras() != null && getIntent().getExtras().size() > 0)
{
Iterator<String> it = getIntent().getExtras().keySet().iterator();
while(it.hasNext()) {
getIntent().removeExtra(it.next());
}
}
setResult(Activity.RESULT_OK);
finish();
}
@Override
public void onConfigurationChanged(Configuration configuration) {
setResult(Activity.RESULT_FIRST_USER, new Intent().putExtra(Codes.Extras.CHANGE_LOCALE, true));
finish();
}
@Override
public void onUpdate(Message message) {
((InformaCamEventListener) fragments.get(fragments.size() - 1)).onUpdate(message);
}
public void autoAdvance() {
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
@Override
public void onSubFragmentCompleted() {}
@Override
public void onSubFragmentInitialized() {}
}