package org.witness.informacam.app.screens;
import java.util.ArrayList;
import java.util.List;
import org.witness.informacam.InformaCam;
import org.witness.informacam.app.PreferencesActivity;
import org.witness.informacam.app.R;
import org.witness.informacam.app.WipeActivity;
import org.witness.informacam.app.utils.Constants.App;
import org.witness.informacam.app.utils.Constants.App.Home.Tabs;
import org.witness.informacam.utils.Constants.Codes;
import org.witness.informacam.app.utils.Constants.Codes.Routes;
import org.witness.informacam.app.utils.Constants.HomeActivityListener;
import org.witness.informacam.app.utils.Constants.Preferences;
import org.witness.informacam.app.utils.adapters.NotificationsListAdapter;
import org.witness.informacam.app.utils.adapters.OrganizationsListAdapter;
import org.witness.informacam.models.credentials.IUser;
import org.witness.informacam.models.notifications.INotification;
import org.witness.informacam.models.organizations.IOrganization;
import org.witness.informacam.utils.Constants.ListAdapterListener;
import org.witness.informacam.utils.Constants.Models;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;
public class UserManagementFragment extends Fragment implements OnClickListener, ListAdapterListener
{
View rootView;
TabHost tabHost = null;
ImageButton emergencyWipe, toSettings, thumbnail;
Button exportCredentials;
TextView alias, connectivity, notificationsNoNotifications;
ListView notificationsHolder, organizationsHolder;
LayoutInflater li;
Activity a;
Handler h = new Handler();
int[] dims;
InformaCam informaCam = InformaCam.getInstance();
IUser user = informaCam.user;
List<IOrganization> listOrganizations;
OrganizationsListAdapter listOrganizationsAdapter;
List<INotification> listNotifications;
NotificationsListAdapter listNotificationsAdapter;
@SuppressWarnings("unused")
private static final String LOG = App.Home.LOG;
@Override
public View onCreateView(LayoutInflater li, ViewGroup container, Bundle savedInstanceState)
{
super.onCreateView(li, container, savedInstanceState);
this.li = li;
rootView = li.inflate(R.layout.fragment_home_user_management, null);
tabHost = (TabHost) rootView.findViewById(android.R.id.tabhost);
emergencyWipe = (ImageButton) rootView.findViewById(R.id.emergency_wipe);
emergencyWipe.setOnClickListener(this);
toSettings = (ImageButton) rootView.findViewById(R.id.to_settings);
toSettings.setOnClickListener(this);
thumbnail = (ImageButton) rootView.findViewById(R.id.user_thumbnail);
thumbnail.setOnClickListener(this);
alias = (TextView) rootView.findViewById(R.id.user_alias);
connectivity = (TextView) rootView.findViewById(R.id.user_connectivity);
return rootView;
}
@Override
public void onAttach(Activity a)
{
super.onAttach(a);
this.a = a;
dims = ((HomeActivityListener) a).getDimensions();
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
initLayout(savedInstanceState);
initData();
}
private void initLayout(Bundle savedInstanceState)
{
View v = null;
tabHost.setLayoutParams(new LinearLayout.LayoutParams(dims[0], dims[1]));
tabHost.setup();
TabHost.TabSpec tab = tabHost.newTabSpec(Tabs.CameraChooser.TAG).setIndicator(generateTab(li, R.layout.user_management_fragment_tab, getResources().getString(R.string.notifications)));
v = li.inflate(R.layout.fragment_user_management_notifications, tabHost.getTabContentView(), true);
v.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, (int) (dims[1] * 0.65)));
tab.setContent(R.id.notification_list_root);
tabHost.addTab(tab);
notificationsHolder = (ListView) v.findViewById(R.id.notifications_list_view);
notificationsNoNotifications = (TextView) v.findViewById(R.id.notification_no_notifications);
tab = tabHost.newTabSpec(Tabs.CameraChooser.TAG).setIndicator(
generateTab(li, R.layout.user_management_fragment_tab, getResources().getString(R.string.organizations)));
v = li.inflate(R.layout.fragment_user_management_organizations, tabHost.getTabContentView(), true);
v.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, (int) (dims[1] * 0.65)));
tab.setContent(R.id.organization_list_root);
tabHost.addTab(tab);
organizationsHolder = (ListView) v.findViewById(R.id.organizations_list_view);
exportCredentials = (Button) v.findViewById(R.id.organizations_export_key);
exportCredentials.setOnClickListener(this);
tabHost.setCurrentTab(0);
}
private void initData()
{
alias.setText(user.alias);
int connectivityLabel = informaCam.isConnectedToTor() ? R.string.connected_to_tor : R.string.not_connected_to_tor;
connectivity.setText(getResources().getString(connectivityLabel));
h.post(new Runnable()
{
@Override
public void run()
{
initNotifications();
initOrganizations();
}
});
}
private void initOrganizations()
{
listOrganizations = informaCam.installedOrganizations.listOrganizations();
organizationsHolder.setOnItemLongClickListener(new OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int viewId, long l)
{
IOrganization org = listOrganizations.get((int) l);
((HomeActivityListener) a).getContextualMenuFor(org);
return true;
}
});
listOrganizationsAdapter = new OrganizationsListAdapter(listOrganizations);
organizationsHolder.setAdapter(listOrganizationsAdapter);
}
private void initNotifications() {
listNotifications = informaCam.notificationsManifest.sortBy(Models.INotificationManifest.Sort.COMPLETED);
notificationsHolder.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int viewId, long l)
{
INotification notification = informaCam.notificationsManifest.notifications.get((int) l);
((HomeActivityListener) a).getContextualMenuFor(notification);
return true;
}
});
listNotificationsAdapter = new NotificationsListAdapter(listNotifications);
notificationsHolder.setAdapter(listNotificationsAdapter);
if (listNotifications != null && listNotifications.size() > 0)
{
notificationsNoNotifications.setVisibility(View.GONE);
return;
}
notificationsNoNotifications.setVisibility(View.VISIBLE);
}
private static View generateTab(final LayoutInflater li, final int layout, final String labelText)
{
View tab = li.inflate(layout, null);
TextView label = (TextView) tab.findViewById(R.id.tab_label);
label.setText(labelText);
return tab;
}
@Override
public void onClick(View v)
{
if (v == emergencyWipe)
{
Intent wipeIntent = new Intent(a, WipeActivity.class);
a.startActivityForResult(wipeIntent, Routes.WIPE);
}
else if (v == toSettings)
{
((HomeActivityListener) a).setLocale(PreferenceManager.getDefaultSharedPreferences(a).getString(Preferences.Keys.LANGUAGE, "0"));
Intent settingIntent = new Intent(a, PreferencesActivity.class);
a.startActivity(settingIntent);
}
else if (v == thumbnail)
{
// TODO
} else if(v == exportCredentials) {
a.startActivity(informaCam.exportCredentials());
}
}
@Override
public void updateAdapter(int which)
{
switch (which)
{
case Codes.Adapters.NOTIFICATIONS:
a.runOnUiThread(new Runnable() {
@Override
public void run() {
listNotifications = informaCam.notificationsManifest.sortBy(Models.INotificationManifest.Sort.COMPLETED);
listNotificationsAdapter.update(listNotifications == null ? new ArrayList<INotification>() : listNotifications, a);
notificationsHolder.invalidate();
}
});
break;
case Codes.Adapters.ORGANIZATIONS:
a.runOnUiThread(new Runnable() {
@Override
public void run() {
listOrganizations = informaCam.installedOrganizations.organizations;
listOrganizationsAdapter.update(listOrganizations);
organizationsHolder.invalidate();
}
});
break;
case Codes.Adapters.ALL:
if (tabHost != null)
{
if (tabHost.getCurrentTab() == 0)
{
updateAdapter(Codes.Adapters.NOTIFICATIONS);
}
else if (tabHost.getCurrentTab() == 1)
{
updateAdapter(Codes.Adapters.ORGANIZATIONS);
}
}
break;
}
}
@Override
public void setPending(int numPending, int numCompleted) {}
}