android app/jiraForAndroid/src/jira/For/Android/DLog.java
public class DLog {

	public static void i(String message) {
		Log.i("jira_for_android", message);
	}

	public static void i(String TAG, String message) {
		Log.i(TAG, message);
	}

	public static void e(String message) {
		Log.e("jira_for_android", message);
	}

	public static void e(String TAG, String message) {
		Log.e(TAG, message);
	}
}
android app/jiraForAndroid/src/jira/For/Android/Connector/Connector.java
@Singleton
public final class Connector {

	@Inject
	private ConnectorUser connectorUser;
	@Inject
	private ConnectorIssueTypes connectorIssueTypes;
	@Inject
	private ConnectorPriority connectorPriority;
	@Inject
	private ConnectorStatus connectorStatus;
	@Inject
	private AuthenthicationService authenthicationService = new AuthenthicationService();
	private String username;
	private HashMap<String, User> users = new HashMap<String, User>();;
	private ImagesCacher imagesCacher;
	public HashMap<String, String> issuesTypesNames = new HashMap<String, String>();
	public HashMap<String, String> issuesPrioritiesNames = new HashMap<String, String>();
	public HashMap<String, String> issuesStatusesNames = new HashMap<String, String>();
	private static HashMap<String, IssueType> issueTypes = new HashMap<String, IssueType>();
	private static HashMap<String, Priority> priorities = new HashMap<String, Priority>();
	private static HashMap<String, Status> statuses = new HashMap<String, Status>();
	// Namespace we dontneed it now.
	private boolean isConnected = false;

	public boolean getIsConnected() {
		return isConnected;
	}

	public void setIsConnected(boolean isConnected) {
		this.isConnected = isConnected;
	}

	private void setUsernamePasswordUrl(String username, String password,
	        String url) {

		this.username = username;
	}

	/**
	 * This method login user to jira and get a token form it.
	 * 
	 * @return Returns true if login gone okey.
	 * @throws AuthorizationException
	 * @throws Exception
	 */
	public boolean jiraLogin(String username, String password, String url,
	        boolean secureConnection) throws AuthenticationException,
	        CommunicationException, AuthorizationException {
		String protocol = secureConnection ? "https://" : "http://";
		URL surl;
        try {
	        surl = new URL(protocol+url);
        } catch (MalformedURLException e) {
	        throw new CommunicationException(e);
        }
		authenthicationService.login(username, password, surl);

		downloadIssueTypes();
		downloadPriorities();
		downloadStatuses();
		imagesCacher = ImagesCacher.getInstance2(issueTypes, priorities,
		        statuses, null);
		imagesCacher.downloadAllNeededData();
		setUsernamePasswordUrl(username, password, url);
		return true;
	}

	/**
	 * This method logout user from the server.
	 * 
	 * @return Returns true if logout gone okey.
	 * @throws Exception
	 */
	public boolean jiraLogout() {
		authenthicationService.logout();
		return true;
	}

	/**
	 * Download User full information
	 * 
	 * @throws AuthenticationException
	 * @throws AuthorizationException
	 * @throws CommunicationException
	 * @throws Exception
	 */
	User downloadUserInformation(String username)
	        throws CommunicationException, AuthorizationException,
	        AuthenticationException {

		if (!users.containsKey(username)) {
			users.put(username, connectorUser.jiraGetUser(username));
		}
		return getUser(username);
	}

	/**
	 * Get user form HashMap
	 * 
	 * @return
	 */
	public User getUser(String username) {
		return users.get(username);
	}

	/**
	 * Get all users
	 */
	public HashMap<String, User> getUsers() {
		// System.out.println("Mam tyle userow: " + users.size());
		return users;
	}

	/**
	 * Get user logged in this application
	 * 
	 * @return
	 * @throws Exception
	 */
	public User getThisUser() {

		return getUser(username);
	}

	/*
	 * Poniższe metody dotyczące IssueTypes i Priorities nie działają do końca
	 * (nie wiedzieć czemu, wywalają błędy o nullowości HashMapy), jednakże są
	 * one tutaj, by uniknąć niepotrzebnych mergy w najbliższym czasie, - Michał
	 */
	/**
	 * Download all issue types
	 * 
	 * @throws AuthenticationException
	 * @throws AuthorizationException
	 * @throws CommunicationException
	 * @throws Exception
	 */
	public void downloadIssueTypes() throws CommunicationException,
	        AuthorizationException, AuthenticationException {
		issueTypes = connectorIssueTypes.jiraGetIssueTypes();
	}

	/**
	 * Get issue type from HashMap
	 */
	public IssueType getIssueType(String type) {
		return issueTypes.get(type);
	}

	/**
	 * Get all issue types
	 */
	public HashMap<String, IssueType> getIssueTypes() {
		return issueTypes;
	}

	/**
	 * Download all priorities
	 * 
	 * @throws AuthenticationException
	 * @throws AuthorizationException
	 * @throws CommunicationException
	 * @throws RemoteException
	 * @throws Exception
	 */
	public void downloadPriorities() throws CommunicationException,
	        AuthorizationException, AuthenticationException {
		priorities = connectorPriority.jiraGetPriorities();
	}

	/**
	 * Get priority type from HashMap
	 */
	public Priority getPriority(String priority) {
		DLog.i("ilosc priorytetow", String.valueOf(priorities.size()));
		return priorities.get(priority);
	}

	/**
	 * Download all statuses
	 * 
	 * @throws AuthenticationException
	 * @throws AuthorizationException
	 * @throws CommunicationException
	 * @throws Exception
	 */
	public void downloadStatuses() throws CommunicationException,
	        AuthorizationException, AuthenticationException {
		statuses = connectorStatus.jiraGetStatuses();
	}

	/**
	 * Get status type from HashMap
	 */
	public Status getStatus(String status) {
		return statuses.get(status);
	}

	/**
	 * Get all priorities
	 */
	public HashMap<String, Priority> getPriorities() {
		return priorities;
	}

	/**
	 * @return Returns the Token
	 */
	public String getToken() {
		return authenthicationService.getToken();
	}


	/**
	 * Check do we have internet connection simply is data transfer is available
	 */
	public boolean doWeHaveInternet(Context context) {

		if (context == null) {
			DLog.e("Connector", "doWeHaveInternet() context is NULL!");
			return false;
		}
		ConnectivityManager manager = (ConnectivityManager) context
		        .getSystemService(Context.CONNECTIVITY_SERVICE);

		NetworkInfo netInfo = manager.getActiveNetworkInfo();
		if (netInfo == null) {
			return false;
		}

		return netInfo.isConnected();
	}

}
android app/jiraForAndroid/src/jira/For/Android/Login/LoginActivity.java
public class LoginActivity extends RoboActivity {

	// For putExtra
	public static final String pls_do_not_login_me = "pls_do_not_login_me";
	// Layout components
	private EditText urlAddress, username, password;
	private Button buttonLogin;
	private Spinner spinner;
	private InputMethodManager imm;
	private View mainLayout;

	// Thread for canceling
	private LoginThread thread;
	private LoginActivity loginActivity = this;
	public boolean cos = false;
	@Inject
	private Connector connector;

	@Override
	public void onCreate(Bundle savedInstanceState) {

		DLog.i("LoginActivity", "onCreate() <--- i'm here");

		super.onCreate(savedInstanceState);

		setContentView(R.layout.login_activity_layout);

		// Setting INVISIBLE becouse default they are visible ;)
		findViewById(R.id.data_is_loading).setVisibility(TextView.INVISIBLE);
		findViewById(R.id.progress_bar).setVisibility(TextView.INVISIBLE);

		mainLayout = findViewById(R.id.login_activity_linearlay);
		urlAddress = (EditText) findViewById(R.id.login_URL_EditText);
		username = (EditText) findViewById(R.id.login_username_EditText);
		password = (EditText) findViewById(R.id.login_password_EditText);
		imm = (InputMethodManager) loginActivity
		        .getSystemService(Context.INPUT_METHOD_SERVICE);
		findViewById(R.id.login_relativeLayout);

		buttonLogin = (Button) this.findViewById(R.id.login_login_Button);
		// Add action to login button
		buttonLogin.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				imm.hideSoftInputFromWindow(password.getWindowToken(), 0);
				login();
			}
		});

		spinner = (Spinner) findViewById(R.id.spinner_http_Or_https);

		assert (spinner.getCount() == 1);// TODO FOr Test change to 2 not 1
		// For getting saved data like user, password and url
		final SharedPreferences settings = getSharedPreferences(
		        PreferenceKeyHolder.PREFERENCE_SETTINGS_USER_DATA, MODE_PRIVATE);

		spinner.setSelection(settings.getInt(
		        PreferenceKeyHolder.PREFERENCE_HTTP_OR_HTTPS,
		        DefaultPreference.PREFERENCE_HTTP_OR_HTTPS));

		if (settings.contains(PreferenceKeyHolder.PREFERENCE_URL_FIELD)
		        || settings.contains(PreferenceKeyHolder.PREFERENCE_USER_FIELD)
		        || settings
		                .contains(PreferenceKeyHolder.PREFERENCE_PASSWORD_FIELD)) {

			((CheckBox) findViewById(R.id.login_checkbox)).setChecked(true);

			urlAddress.setText(settings.getString(
			        PreferenceKeyHolder.PREFERENCE_URL_FIELD, ""));
			username.setText(settings.getString(
			        PreferenceKeyHolder.PREFERENCE_USER_FIELD, ""));
			password.setText(settings.getString(
			        PreferenceKeyHolder.PREFERENCE_PASSWORD_FIELD, ""));

			Bundle extras = getIntent().getExtras();
			if (extras == null
			        || (!extras.getBoolean(pls_do_not_login_me, false))) login();
		}

		urlAddress.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if ((event.getAction() == KeyEvent.ACTION_DOWN)
				        && (keyCode == KeyEvent.KEYCODE_TAB)) {
					// Perform action on key press
					Log.d("urlAddress", "Tab");
					username.requestFocus();
					return true;
				}

				return false;
			}
		});
		username.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if ((event.getAction() == KeyEvent.ACTION_DOWN)
				        && (keyCode == KeyEvent.KEYCODE_TAB)) {
					// Perform action on key press
					Log.d("username", "Tab");
					password.requestFocus();
					return true;
				}

				return false;
			}
		});

		password.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if ((event.getAction() == KeyEvent.ACTION_DOWN)
				        && (keyCode == KeyEvent.KEYCODE_ENTER)) {
					// Perform action on key press
					Log.d("password", "Enter");
					imm.hideSoftInputFromWindow(password.getWindowToken(), 0);
					login();
					return true;
				}
				if ((event.getAction() == KeyEvent.ACTION_DOWN)
				        && (keyCode == KeyEvent.KEYCODE_TAB)) {
					// Perform action on key press
					Log.d("password", "Tab");
					imm.hideSoftInputFromWindow(password.getWindowToken(), 0);
					buttonLogin.requestFocus();
					return true;
				}

				return false;
			}
		});

		mainLayout.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {

				imm.hideSoftInputFromWindow(mainLayout.getWindowToken(), 0);
				return false;
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.menu_logout, menu);
		MenuItem menuItemFeedback = menu.findItem(R.id.feedback);
		MenuItem menuItemHelp = menu.findItem(R.id.help);

		menuItemFeedback
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        Intent intent = new Intent(getBaseContext(),
				                FeedbackActivity.class);
				        startActivity(intent);
				        return false;
			        }
		        });

		MenuItem menuItemLogout = menu.findItem(R.id.logout);
		menuItemLogout
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        if (thread != null) thread.cancel(true);
				        return true;
			        }
		        });

		menuItemHelp.setOnMenuItemClickListener(new OnMenuItemClickListener() {

			@Override
			public boolean onMenuItemClick(MenuItem arg0) {
				HTMLDialog dialog = new HTMLDialog(loginActivity,
				        "login_help.html");
				dialog.show();
				return false;
			}
		});

		return true;
	}

	@Override
	protected void onPause() {
		DLog.i("LoginActivity", "onPause() <--- i'm here");
		super.onPause();
	}

	@Override
	protected void onStop() {
		super.onStop();
		DLog.i("LoginActivity", "onStop() <--- i'm here");
	};

	@Override
	protected void onStart() {
		super.onStart();
		DLog.i("LoginActivity", "onStart() <--- i'm here");
		if (connector == null || connector.getIsConnected()) finish();
		connector.setIsConnected(false);
	};

	@Override
	protected void onResume() {
		DLog.i("LoginActivity", "onResume() <--- i'm here");
		super.onResume();

	}

	@Override
	protected void onDestroy() {
		DLog.i("LoginActivity", "onDestroy() <--- i'm here");

		// if checkbox is unchecked we delete login,pas,url from memory
		if (!((CheckBox) findViewById(R.id.login_checkbox)).isChecked()) {
			SharedPreferences settings = getSharedPreferences(
			        PreferenceKeyHolder.PREFERENCE_SETTINGS_USER_DATA,
			        MODE_PRIVATE);
			settings.edit().clear().commit();
		}

		super.onDestroy();
	};

	@Override
	public void onBackPressed() {
		DLog.i("LoginActivity", "onBackPressed() <--- i'm here");

		// Przerywamy prace wątku
		// TODO ładniue to poprawić :)
		if (thread != null) thread.cancel(true);
		super.onBackPressed();
		// TODO Wyświetlić zapytanie czy na pewno chcemy zamknąć aplikacje
	};

	/**
	 * Performing action of logging. Checks the correctness of data which is
	 * gathered from layout components. Informs user about the errors. This
	 * method is called only when we click on login button
	 */
	private void login() {
		DLog.i("LoginActivity", "login() <--- i'm here");

		String url = getUrlAddress();
		String usr = getUsername();
		String pas = getPassword();
		if (url == null) urlAddress
		        .setError(getString(R.string.login_toast_wrongURL));
		else if (usr == null) username
		        .setError(getString(R.string.login_toast_invalidUsername));
		else if (pas == null) password
		        .setError(getString(R.string.login_toast_invalidPassword));
		else if (!connector.doWeHaveInternet(this)) Toast
		        .makeText(this, getString(R.string.login_toast_no_internet),
		                Toast.LENGTH_SHORT).show();
		else {
			SharedPreferences settings = getSharedPreferences(
			        PreferenceKeyHolder.PREFERENCE_SETTINGS_USER_DATA,
			        MODE_PRIVATE);
			
			// Execution of new thread for login
			thread = new LoginThread(this, settings, url, usr, pas, username,
			        password, urlAddress, buttonLogin, spinner, connector);
			thread.execute();
		}
	}

	/**
	 * Method gets the value from urlAddress and validates it.
	 * 
	 * @return valid URL or null
	 */
	private String getUrlAddress() {
		String str = urlAddress.getText().toString().trim();
		return str;
	}

	/**
	 * Get the name of the user.
	 * 
	 * @return trimmed String from username component or null
	 */
	private String getUsername() {
		// Get username form EditText

		Editable str = username.getText();
		if (str == null || str.length() == 0) {
			return null;
		}
		return str.toString().trim();
	}

	/**
	 * Get the password of the user.
	 * 
	 * @return password as a CharSequence or null
	 */
	private String getPassword() {
		// Get password form EditText
		String cs = password.getText().toString();
		if (cs == null || cs.length() == 0) {
			return null;
		}
		return cs;
	}
}
android app/jiraForAndroid/src/jira/For/Android/Connector/ConnectorIssues.java
@Singleton
public class ConnectorIssues {

	@Inject
	private Connector connector;
	@Inject
	private KSoapExecutor soap;

	public Issue[] getIssuesByJQL(String query, int howMuch)
	        throws CommunicationException, AuthorizationException,
	        AuthenticationException {

		if (query == null || howMuch < 0) throw new IllegalArgumentException(
		        "Bad arguments\nQuery:" + query + " howMuch:" + howMuch);

		SoapObject getIssues = SoapObjectBuilder.start()
		        .withMethod("getIssuesFromJqlSearch")
		        .withProperty("token", connector.getToken())
		        .withProperty("jqlSearch", query)
		        .withProperty("maxResults", howMuch).build();

		return downloadFromServer(getIssues);
	}

	public Issue[] getIssuesFromFilterWithLimit(String filterId, int offSet,
	        int maxNumResults) throws CommunicationException,
	        AuthorizationException, AuthenticationException {

		if (filterId == null || offSet < 0 || maxNumResults < 0) throw new IllegalArgumentException(
		        "Wrong arguments\nfilterId:" + filterId + " offSet:" + offSet
		                + " maxNumResults:" + maxNumResults);

		SoapObject getIssuesFromFilter = SoapObjectBuilder.start()
		        .withMethod("getIssuesFromFilterWithLimit")
		        .withProperty("token", connector.getToken())
		        .withProperty("filterId", filterId)
		        .withProperty("offSet", offSet)
		        .withProperty("maxNumResults", maxNumResults).build();

		return downloadFromServer(getIssuesFromFilter);
	}

	private Issue[] downloadFromServer(SoapObject getIssues)
	        throws CommunicationException, AuthorizationException,
	        AuthenticationException {

		@SuppressWarnings("unchecked")
        Vector<SoapObject> vc = soap.execute(getIssues, Vector.class);
		if (vc == null) return null;

		Issue[] issues = new Issue[vc.size()];

		SoapObject p;// Pomocnicza zmienna!
		for (int i = 0; i < vc.size(); ++i) {
			p = vc.get(i);

			String assigneeFullName;
			String assignee = p.getPropertySafelyAsString("assignee");
			if (assignee == null || assignee.compareToIgnoreCase("null") == 0) assigneeFullName = "Unassigned";
			else assigneeFullName = connector.downloadUserInformation(assignee)
			        .getFullname();
			String reporterFullName;
			String reporter = p.getPropertySafelyAsString("reporter");
			if (reporter == null || reporter.compareToIgnoreCase("null") == 0) reporterFullName = "NO REPORTER";
			else reporterFullName = connector.downloadUserInformation(reporter)
			        .getFullname();

			issues[i] = new Issue(p.getPropertySafelyAsString("id"), assignee,
			        assigneeFullName,
			        p.getPropertySafelyAsString("description"),
			        p.getPropertySafelyAsString("updated"),
			        p.getPropertySafelyAsString("created"),
			        p.getPropertySafelyAsString("duedate"),
			        p.getPropertySafelyAsString("environment"),
			        p.getPropertySafelyAsString("key"),
			        p.getPropertySafelyAsString("priority"),
			        p.getPropertySafelyAsString("project"), reporter,
			        reporterFullName,
			        p.getPropertySafelyAsString("resolution"),
			        p.getPropertySafelyAsString("status"),
			        p.getPropertySafelyAsString("summary"),
			        p.getPropertySafelyAsString("type"), Long.parseLong(p
			                .getPropertySafelyAsString("votes")));
		}
		return issues;
	}

	// TODO Naprawić przyszły bug
	/*-
	http://confluence.atlassian.com/display/JIRA042/Advanced+Searching?clicked=jirahelp#AdvancedSearching-Parent
	Only available if sub-tasks have been enabled by your JIRA administrator.

	Search for all sub-tasks of a particular issue. You can search by Issue Key or by Issue ID (i.e. the number that JIRA automatically allocates to an Issue).

	Note: this field does not support auto-complete.
	 */
}
android app/jiraForAndroid/src/jira/For/Android/TaskDetails/TaskDetailsActivity.java
public class TaskDetailsActivity extends RoboFragmentActivity {

	enum Tabs {
		basicInfo, comments, worklog, attachments;

		static Tabs fromInt(int a) {
			switch (a) {
				case 0:
					return comments;
				case 1:
					return basicInfo;
				case 2:
					return worklog;
				case 3:
					return attachments;
			}
			return null;
		}
	}

	// Displayed task
	private Issue task;

	private Context ctx;

	MyPagerAdapter pagerAdapter;
	ViewPager viewPager;
	ViewPagerIndicator indicator;
	TaskDetailsActivity taskDetailsActivity = this;
	@Inject
	private Connector connector;
	@Inject
	private ConnectorComments connectorComments;
	@Inject
	private ConnectorWorkLog connectorWorkLog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ctx = this;

		// Activity isnt restarting on change orientation look manifest
		setContentView(R.layout.taskdetailsactivitylayout);

		ImageView homeButton = (ImageView) findViewById(R.id.image_home);
		homeButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				DLog.i("Filters Home", "Home button was pressed.");

				// Ends all activities turned on after ProjectListActivity
				Intent intent = new Intent(getBaseContext(),
				        ProjectListActivity.class);
				intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(intent);
			}
		});

		// taking task form getExtras
		Bundle extras = getIntent().getExtras();
		task = (Issue) extras.getSerializable("task");

		// setting adapter and its layout
		pagerAdapter = new MyPagerAdapter(new ViewsForTaskDetails(this, task, connector, connectorComments, connectorWorkLog));
		viewPager = (ViewPager) findViewById(R.id.view_pager);
		viewPager.setAdapter(pagerAdapter);
		viewPager.setOffscreenPageLimit(10);

		// setting currently displayed window as "Basic Info"
		viewPager.setCurrentItem(1);
		indicator = (ViewPagerIndicator) findViewById(R.id.view_pager_indicator);
		viewPager.setOnPageChangeListener(indicator);
		indicator.init(1, pagerAdapter.getCount(), pagerAdapter);
		indicator.setFocusedTextColor(new int[] {255, 0, 0});

		// setting project name on the bar at the top
		TextView projectNameTextView = (TextView) findViewById(R.id.text);
		projectNameTextView.setText(task.getKey());

		// Getting out colors
		int color = getResources().getColor(R.color.page_indicator);
		indicator.setFocusedTextColor(indicator.getColorsFromInt(color));

		ImageView refreshButton = (ImageView) findViewById(R.id.image_refresh);
		refreshButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				int curitem = viewPager.getCurrentItem();
				pagerAdapter = new MyPagerAdapter(new ViewsForTaskDetails(
				        taskDetailsActivity, task, connector, connectorComments, connectorWorkLog));
				viewPager.setAdapter(pagerAdapter);
				viewPager.setOffscreenPageLimit(10);
				indicator.init(curitem, pagerAdapter.getCount(), pagerAdapter);
				viewPager.setCurrentItem(curitem, false);
				int color = getResources().getColor(R.color.page_indicator);
				indicator.setFocusedTextColor(indicator.getColorsFromInt(color));

			}
		});

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.menu_logout, menu);
		MenuItem menuItemLogout = menu.findItem(R.id.logout);
		MenuItem menuItemHelp = menu.findItem(R.id.help);

		MenuItem menuItemFeedback = menu.findItem(R.id.feedback);
		menuItemFeedback
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        Intent intent = new Intent(getBaseContext(),
				                FeedbackActivity.class);
				        startActivity(intent);
				        return false;
			        }
		        });
		menuItemLogout
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        // TODO czy podłączyć?
				        // if (thread != null) thread.cancel(true);
				        Intent intent = new Intent(getBaseContext(),
				                LoginActivity.class);
				        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				        intent.putExtra(LoginActivity.pls_do_not_login_me, true);
				        startActivity(intent);
				        finish();
				        connector.jiraLogout();
				        return true;
			        }
		        });

		menuItemHelp.setOnMenuItemClickListener(new OnMenuItemClickListener() {

			@Override
			public boolean onMenuItemClick(MenuItem arg0) {
				HTMLDialog dialog = new HTMLDialog(ctx,
				        "task_details_help.html");
				dialog.show();
				return false;
			}
		});
		return true;
	}

}
android app/jiraForAndroid/src/jira/For/Android/GeneralActivity.java
public abstract class GeneralActivity extends RoboActivity {

	protected GoogleAnalyticsTracker googleAnalyticsTracker;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		googleAnalyticsTracker = GoogleAnalyticsTracker.getInstance();
		googleAnalyticsTracker.startNewSession("UA-30681839-2", this);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		googleAnalyticsTracker.stopSession();
	}
}
android app/jiraForAndroid/src/jira/For/Android/Help/HTMLDialog.java
public class HTMLDialog extends Dialog {

	public HTMLDialog(Context context, String filename) {
		super(context);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.help);
		WebView wv = (WebView) this.findViewById(R.id.help_WebView);
		wv.loadUrl("file:///android_asset/" + filename);
	}

}
android app/jiraForAndroid/src/jira/For/Android/ProjectList/ProjectListActivity.java
public class ProjectListActivity extends GeneralActivity implements
        OnItemClickListener {

	Project[] projects;
	private LoadProjectsThread thread;
	ProjectListActivity projectListActivity;
	private Context ctx;
	private ImageView refresh;
	@Inject
	private Connector connector;
	@Inject
	private ConnectorProjects connectorProjects;
	
	public ImageView getRefreshButton() {
		return refresh;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {

		ctx = this;

		// Activity isnt restarting on change orientation look manifest
		DLog.i("ProjectListActivity",
		        "onCreate() ProjectListActivity <-- I'm here!");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.project_list_view_activity);
		refresh = (ImageView) findViewById(R.id.image_refresh);

		TextView txtView = (TextView) findViewById(R.id.text);
		txtView.setText(R.string.projects);
		projectListActivity = this;
		thread = new LoadProjectsThread(getWindow().getDecorView(), this, connectorProjects);
		thread.execute();
		refresh.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				findViewById(R.id.data_is_loading).setVisibility(
				        TextView.VISIBLE);
				findViewById(R.id.progress_bar).setVisibility(TextView.VISIBLE);
				findViewById(R.id.project_list_no_projects).setVisibility(
				        View.INVISIBLE);
				findViewById(R.id.project_list_view).setVisibility(
				        View.INVISIBLE);
				thread = new LoadProjectsThread(getWindow().getDecorView(),
				        projectListActivity, connectorProjects);
				thread.execute();

			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.menu_logout, menu);
		MenuItem menuItemLogout = menu.findItem(R.id.logout);
		MenuItem menuItemFeedback = menu.findItem(R.id.feedback);
		MenuItem menuItemHelp = menu.findItem(R.id.help);

		menuItemFeedback
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        Intent intent = new Intent(getBaseContext(),
				                FeedbackActivity.class);
				        startActivity(intent);
				        return false;
			        }
		        });

		menuItemLogout
		        .setOnMenuItemClickListener(new OnMenuItemClickListener() {

			        @Override
			        public boolean onMenuItemClick(MenuItem item) {
				        // TODO czy podłączyć?
				        // if (thread != null) thread.cancel(true);
				        Intent intent = new Intent(getBaseContext(),
				                LoginActivity.class);
				        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				        intent.putExtra(LoginActivity.pls_do_not_login_me, true);
				        startActivity(intent);
				        finish();
				        connector.jiraLogout();
				        return true;
			        }
		        });
		
		menuItemHelp.setOnMenuItemClickListener(new OnMenuItemClickListener() {
			
			@Override
			public boolean onMenuItemClick(MenuItem arg0) {
				HTMLDialog dialog = new HTMLDialog(ctx,
				        "project_list_help.html");
				dialog.show();
				return false;
			}
		});
		
		return true;
	}

	@Override
	public void onBackPressed() {
		DLog.i("LoginActivity", "onBackPressed() <--- i'm here");

		// Przerywamy prace wątku
		if (thread != null) thread.cancel(true);
		super.onBackPressed();
	};

	String[] getListOfStringsFromProjects(Project[] projects) {

		if (projects == null || projects.length == 0) return new String[0];
		String fooProjects = "";
		// Getting projects names contatening them with new line then split them
		// to get simple array of strings
		for (int i = 0; i < projects.length; ++i) {
			fooProjects += (projects[i].getName() + "\n");
		}
		return fooProjects.split("\n");
	}

	@Override
	public void onItemClick(AdapterView<?> l, View v, int pos, long id) {

		// TODO for tests only
		DLog.i("ProjectListActivity", "I selected " + projects[pos].getName()
		        + " selected");

		Intent intent = new Intent(this, FiltersListActivity.class);
		intent.putExtra("projectID", projects[pos].getId());
		startActivity(intent);
	}
}
android app/jiraForAndroid/src/jira/For/Android/DataTypes/Issue.java
public class Issue implements Serializable {

	private static final long serialVersionUID = 1L;
	private String id, assignee, assigneeFullName, description, environment, key, priority,
	        project, reporter, reporterFullName, resolution, status, summary, type;
	private long votes;

	private Date updated, created, duedate;// xsd:dateTime

	// Poniższe zostaną poprawione w przyszłości
	//private String fixVersions;// impl:ArrayOf_tns1_RemoteVersion
	//private String customFieldValues;// impl:ArrayOf_tns1_RemoteCustomFieldValue
	//private String components;// impl:ArrayOf_tns1_RemoteComponent
	//private String attachmentNames;// impl:ArrayOf_xsd_string
	//private String affectsVersions;// impl:ArrayOf_tns1_RemoteVersion

	@Deprecated
	public void pochwalSie() {
		System.out.println("\nKey: " + key + "\nassignee: " + assignee
		        + "\nsummary: " + summary + "\nid: " + id + "\ndescription: "
		        + description + "\nevn: " + environment + "\nPriority: "
		        + priority + "\nproject: " + project + "\nreporter: "
		        + reporter + "\nresolution: " + resolution + "\nstatus: "
		        + status + "\nsummary: " + summary + "\ntype: " + type
		        + "\nvotes: " + votes);
	}

	public Issue(String id, String assignee, String assigneeFullName,
				 String description, String updated, String created,
				 String duedate, String environment, String key,
				 String priority, String project, String reporter,
				 String reporterFullName, String resolution, String status,
				 String summary, String type, long votes) {

		setId(id);
		setAssignee(assignee);
		setAssigneeFullName(assigneeFullName);
		setDescription(description);
		setEnvironment(environment);
		setKey(key);
		setPriority(priority);
		setProject(project);
		setReporter(reporter);
		setReporterFullName(reporterFullName);
		setResolution(resolution);
		setStatus(status);
		setSummary(summary);
		setType(type);
		setVotes(votes);

		// Parsing dates
		setDuedate(duedate);
		setCreated(created);
		setUpdated(updated);
	}

	public final String getId() {
		return id;
	}

	public final void setId(String id) {
		if (id == null || id.compareToIgnoreCase("null") == 0) this.id = "NO ID";
		else this.id = id;
	}

	public final String getAssigneeName() {
		return assignee;
	}

	public final void setAssignee(String assignee) {
		if (assignee == null || assignee.compareToIgnoreCase("null") == 0) this.assignee = "NO ASSIGNEE";
		else this.assignee = assignee;
	}
	
	public final String getAssigneeFullName() {
		return assigneeFullName;
	}
	
	public final void setAssigneeFullName(String assigneeFullName) {
		if (assigneeFullName == null || assigneeFullName.compareToIgnoreCase("null") == 0)
			this.assigneeFullName = "Unassigned";
		else this.assigneeFullName = assigneeFullName;
	}

	public final String getDescription() {
		return description;
	}

	public final void setDescription(String description) {
		if (description == null || description.compareToIgnoreCase("null") == 0) this.description = "NO DESCRIPTION";
		else this.description = description;
	}

	public final String getEnvironment() {
		return environment;
	}

	public final void setEnvironment(String environment) {
		if (environment == null || environment.compareToIgnoreCase("null") == 0) this.environment = "NO ENVIRONMENT";
		else this.environment = environment;
	}

	public final String getKey() {
		return key;
	}

	public final void setKey(String key) {
		if (key == null || key.compareToIgnoreCase("null") == 0) this.key = "NO KEY";
		else this.key = key;
	}

	public final String getPriority() {
		return priority;
	}

	public final void setPriority(String priority) {
		if (priority == null || priority.compareToIgnoreCase("null") == 0) this.priority = "NO PRIORITY";
		else this.priority = priority;
	}

	public final String getProject() {
		return project;
	}

	public final void setProject(String project) {
		if (project == null || project.compareToIgnoreCase("null") == 0) this.project = "NO PROJECT";
		else this.project = project;
	}

	public final String getReporterName() {
		return reporter;
	}

	public final void setReporter(String reporter) {
		if (reporter == null || reporter.compareToIgnoreCase("null") == 0) this.reporter = "NO REPORTER";
		else this.reporter = reporter;
	}
	
	public final String getReporterFullName() {
		return reporterFullName;
	}
	
	public final void setReporterFullName(String reporterFullName) {
		if (reporterFullName == null || reporterFullName.compareToIgnoreCase("null") == 0)
			this.reporterFullName = "NO REPORTER";
		else this.reporterFullName = reporterFullName;
	}

	public final String getResolution() {

		return resolution;
	}

	public final void setResolution(String resolution) {
		if (resolution == null || resolution.compareToIgnoreCase("null") == 0) this.resolution = "Unresolved";
		//else this.resolution = resolution;
		else this.resolution = "Fixed";
	}

	public final String getStatus() {

		return status;
	}

	public final void setStatus(String status) {
		if (status == null || status.compareToIgnoreCase("null") == 0) this.status = "NO STATUS";
		else this.status = status;
	}

	public final String getSummary() {

		return summary;
	}

	public final void setSummary(String summary) {
		if (summary == null || summary.compareToIgnoreCase("null") == 0) this.summary = "NO SUMMARY";
		else this.summary = summary;
	}

	public final String getType() {

		return type;
	}

	public final void setType(String type) {
		if (type == null || type.compareToIgnoreCase("null") == 0) this.type = "NO TYPE";
		else this.type = type;
	}

	public final long getVotes() {
		return votes;
	}

	public final void setVotes(long votes) {
		this.votes = votes;
	}
	
	public final Date getUpdatedAsDate() {
		return updated;
	}

	public final String getUpdated() {
		if (updated == null) return "NO UPDATED";
		return updated.toLocaleString();
	}

	public final void setUpdated(String updated) {
		this.updated = DataTypesMethods.GMTStringToLocalDate(updated);
	}

	public final String getCreated() {
		if (created == null) return "NO CREATED";
		return created.toLocaleString();
	}

	public final void setCreated(String created) {

		if (created != null && created.compareToIgnoreCase("null") != 0) {
			this.created = DataTypesMethods.GMTStringToLocalDate(created);
		}
	}

	public final String getDuedate() {
		if (duedate == null) return "NO DUEDATE";
		return duedate.toLocaleString();
	}

	public final void setDuedate(String duedate) {

		if (duedate != null && duedate.compareToIgnoreCase("null") != 0) {
			this.duedate = DataTypesMethods.stringToDate(duedate);
		}
	}
}
android app/jiraForAndroid/src/jira/For/Android/Feedback/FeedbackActivity.java
public class FeedbackActivity extends GeneralActivity {

	private EditText textWithFeedback;
	private final String FEEDBACK = "feedback:";
	FeedbackActivity feedbackActivity = this;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.feedback_activity);

		textWithFeedback = (EditText) findViewById(R.id.feedbackForm);

		Button buttonSend = (Button) findViewById(R.id.buttonSend);
		Button buttonBack = (Button) findViewById(R.id.buttonBack);
		buttonBack.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				onBackPressed();
			}
		});

		buttonSend.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				googleAnalyticsTracker.trackEvent("Clicks", // Category
				        "Button", // Action
				        "send feedback", // Label
				        1); // Value

				ErrorReporter.getInstance().putCustomData(FEEDBACK,
				        textWithFeedback.getText().toString());
				ErrorReporter.getInstance().handleSilentException(
				        new Throwable("Feedback information"));

				Toast.makeText(
				        feedbackActivity,
				        feedbackActivity
				                .getString(R.string.thanks_for_feedback),
				        Toast.LENGTH_SHORT).show();

				finish();
			}
		});
	}
}


Question: package jira.For.Android.TaskList;
import java.util.Arrays;
import jira.For.Android.DLog;
import jira.For.Android.GeneralActivity;
import jira.For.Android.R;
import jira.For.Android.Connector.Connector;
import jira.For.Android.Connector.ConnectorIssues;
import jira.For.Android.DataTypes.Issue;
import jira.For.Android.Feedback.FeedbackActivity;
import jira.For.Android.Help.HTMLDialog;
import jira.For.Android.Login.LoginActivity;
import jira.For.Android.ProjectList.ProjectListActivity;
import jira.For.Android.TaskDetails.TaskDetailsActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.inject.Inject;




public class TaskListByJQLActivity extends GeneralActivity {

	// Issue[] issues;
	private TaskListByJQLActivity taskListByJQLACtivity;
	public final static int TASKLIST_COUNT = 7;
	public final static int STARTING_POINT = TASKLIST_COUNT / 3;
	ListView listView;
	MyAdapter adapter;
	private boolean isListDownloaded;
	private boolean isDownloading;
	private boolean isLoading;
	private boolean isMoreDataAvaliable;
	private String filterId;
	private String query;
	private TaskJQLThread thread;
	private Context ctx;
	private ImageView refreshButton;
	@Inject
Answer: 	private Connector connector;