-android: ProjectAttach:

- bug fixes (NullPointerException) at login
  - added warning in case manually added project does not support Android
  - usage of lib/error_numbers.h instead of self defined values
  - added link to project URL
This commit is contained in:
Joachim Fritzsch 2013-03-28 12:35:19 +01:00
parent 7e8f2804fc
commit b539fb57a9
5 changed files with 143 additions and 64 deletions

View File

@ -161,6 +161,29 @@
android:id="@+id/project_url" android:id="@+id/project_url"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:clickable="true"
android:onClick="projectUrlClicked"
android:textColor="@color/link"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/header_platform"
android:layout_width="100dp"
android:singleLine="true"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="@string/attachproject_login_header_platform"/>
<TextView
android:id="@+id/project_platform"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"/> android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout> </LinearLayout>

View File

@ -55,6 +55,9 @@
<string name="attachproject_login_header_description">Description:</string> <string name="attachproject_login_header_description">Description:</string>
<string name="attachproject_login_header_home">Home:</string> <string name="attachproject_login_header_home">Home:</string>
<string name="attachproject_login_header_url">Website:</string> <string name="attachproject_login_header_url">Website:</string>
<string name="attachproject_login_header_platform">Android:</string>
<string name="attachproject_login_platform_supported">This project supports calculation on Android devices.</string>
<string name="attachproject_login_platform_not_supported">This project does not support caculation on Android devices yet!</string>
<string name="attachproject_login_category_login">Sign in with existing account</string> <string name="attachproject_login_category_login">Sign in with existing account</string>
<string name="attachproject_login_header_id_email">eMail:</string> <string name="attachproject_login_header_id_email">eMail:</string>
<string name="attachproject_login_header_id_name">Name:</string> <string name="attachproject_login_header_id_name">Name:</string>
@ -88,7 +91,12 @@
<string name="attachproject_registration_toast_error_no_email">eMail missing!</string> <string name="attachproject_registration_toast_error_no_email">eMail missing!</string>
<string name="attachproject_registration_toast_error_no_pwd">Password missing!</string> <string name="attachproject_registration_toast_error_no_pwd">Password missing!</string>
<string name="attachproject_registration_toast_error_unknown">Registration failed.</string> <string name="attachproject_registration_toast_error_unknown">Registration failed.</string>
<string name="attachproject_registration_toast_error_username_required">User name is required!</string> <string name="attachproject_registration_toast_error_bad_username">user name refused, change and try again!</string>
<string name="attachproject_registration_toast_error_email_in_use">eMail is already in use!</string>
<string name="attachproject_registration_toast_error_project_down">Can\'t reach project server!</string>
<string name="attachproject_registration_toast_error_email_bad_syntax">eMail refused, change and try again!</string>
<string name="attachproject_registration_toast_error_bad_pwd">Password refused, change and try again!</string>
<string name="attachproject_registration_toast_error_creation_disabled">Account creation is disabled on this project!</string>
<string name="attachproject_registration_toast_creation_successful">Account created. Logging in&#8230;</string> <string name="attachproject_registration_toast_creation_successful">Account created. Logging in&#8230;</string>
<string name="attachproject_registration_toast_login_successful">Successful.</string> <string name="attachproject_registration_toast_login_successful">Successful.</string>

View File

@ -43,8 +43,10 @@ import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import edu.berkeley.boinc.rpc.AccountOut; import edu.berkeley.boinc.rpc.AccountOut;
import edu.berkeley.boinc.rpc.PlatformInfo;
import edu.berkeley.boinc.rpc.ProjectConfig; import edu.berkeley.boinc.rpc.ProjectConfig;
import edu.berkeley.boinc.rpc.ProjectInfo; import edu.berkeley.boinc.rpc.ProjectInfo;
import edu.berkeley.boinc.utils.BOINCErrors;
public class AttachProjectLoginActivity extends Activity{ public class AttachProjectLoginActivity extends Activity{
@ -59,12 +61,6 @@ public class AttachProjectLoginActivity extends Activity{
private ProjectConfig projectConfig; private ProjectConfig projectConfig;
private Bitmap projectLogo; private Bitmap projectLogo;
// result definitions
public final static int RESULT_OK = 0;
public final static int RESULT_PWD_INCORRECT = -206;
public final static int RESULT_EMAIL_INCORRECT = -136;
public final static int RESULT_NO_CONNECTION = -113;
private ServiceConnection mConnection = new ServiceConnection() { private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) { public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been established, getService returns the Monitor object that is needed to call functions. // This is called when the connection with the service has been established, getService returns the Monitor object that is needed to call functions.
@ -103,6 +99,11 @@ public class AttachProjectLoginActivity extends Activity{
} }
} catch (Exception e) {Log.d(TAG,"no project info...");} } catch (Exception e) {Log.d(TAG,"no project info...");}
if(!projectInfoPresent) { // url can not be taken of ProjectInfo
// format user input on URL right to avoid exceptions
if (!url.startsWith("http://") && !url.startsWith("https://")) url = "http://" + url; // add http:// in case user leaves it out
}
if(!urlPresent && !projectInfoPresent) { if(!urlPresent && !projectInfoPresent) {
// neither url (manual input) nor project info (list selection) is present // neither url (manual input) nor project info (list selection) is present
Log.d(TAG,"neither url nor projectInfo available! finish activity..."); Log.d(TAG,"neither url nor projectInfo available! finish activity...");
@ -165,6 +166,15 @@ public class AttachProjectLoginActivity extends Activity{
website.setText(projectConfig.masterUrl); website.setText(projectConfig.masterUrl);
website.setTag(projectConfig.masterUrl); // set tag to use in onClick website.setTag(projectConfig.masterUrl); // set tag to use in onClick
// set android support
TextView platform = (TextView) findViewById(R.id.project_platform);
if(platformSupported()) {
platform.setText(R.string.attachproject_login_platform_supported);
} else {
platform.setText(R.string.attachproject_login_platform_not_supported);
platform.setTextColor(getResources().getColor(R.color.warning));
}
// set ProjectInfo fields, if ProjectInfo available (after list selection) // set ProjectInfo fields, if ProjectInfo available (after list selection)
if(projectInfoPresent) { if(projectInfoPresent) {
// set layout wrapper visible // set layout wrapper visible
@ -248,6 +258,7 @@ public class AttachProjectLoginActivity extends Activity{
new ProjectLoginAsync().execute(); new ProjectLoginAsync().execute();
} }
// register button's onClick
public void register (View view) { public void register (View view) {
Log.d(TAG, "register: " + view.getTag()); Log.d(TAG, "register: " + view.getTag());
Boolean clientCreation = (Boolean) view.getTag(); Boolean clientCreation = (Boolean) view.getTag();
@ -266,6 +277,14 @@ public class AttachProjectLoginActivity extends Activity{
} }
} }
// project url textview's onClick
public void projectUrlClicked (View view) {
// start intent to project website
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
private Boolean verifyInput(String id, String pwd) { private Boolean verifyInput(String id, String pwd) {
if(id.length() == 0) { if(id.length() == 0) {
Toast toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_name, Toast.LENGTH_SHORT); Toast toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_name, Toast.LENGTH_SHORT);
@ -281,28 +300,28 @@ public class AttachProjectLoginActivity extends Activity{
} }
private void showResultToast(Integer code) { private void showResultToast(Integer code) {
Log.d(TAG,"showResultToast for error: " + code);
Toast toast; Toast toast;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
if(code == null) { if(code == null) {
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG); toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
} } else {
Log.d(TAG,"showResultToast for error: " + code); switch (code) {
switch (code) { case BOINCErrors.ERR_OK:
case RESULT_OK: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_ok, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_ok, Toast.LENGTH_LONG); break;
break; case BOINCErrors.ERR_BAD_PASSWD:
case RESULT_PWD_INCORRECT: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_pwd, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_pwd, Toast.LENGTH_LONG); break;
break; case BOINCErrors.ERR_DB_NOT_FOUND:
case RESULT_EMAIL_INCORRECT: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_name, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_name, Toast.LENGTH_LONG); break;
break; case BOINCErrors.ERR_GETHOSTBYNAME:
case RESULT_NO_CONNECTION: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_internet, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_internet, Toast.LENGTH_LONG); break;
break; default:
default: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG); break;
break; }
} }
toast.show(); toast.show();
} }
@ -327,6 +346,19 @@ public class AttachProjectLoginActivity extends Activity{
startActivity(intent); startActivity(intent);
} }
private Boolean platformSupported() {
if(projectConfig == null) return false;
String platformName = getString(R.string.boinc_platform_name);
Boolean supported = false;
for(PlatformInfo platform: projectConfig.platforms) {
if(platform.name.equals(platformName)) {
supported = true;
continue;
}
}
return supported;
}
private final class ProjectLoginAsync extends AsyncTask<Void, Void, Integer> { private final class ProjectLoginAsync extends AsyncTask<Void, Void, Integer> {
//private final String TAG = "ProjectLoginAsync"; //private final String TAG = "ProjectLoginAsync";
@ -357,11 +389,13 @@ public class AttachProjectLoginActivity extends Activity{
AccountOut account = monitor.lookupCredentials(url, id, pwd); AccountOut account = monitor.lookupCredentials(url, id, pwd);
try { try {
if(account.error_num == RESULT_OK) { if(account.error_num == BOINCErrors.ERR_OK) {
Boolean attach = monitor.attachProject(url, id, account.authenticator); Boolean attach = monitor.attachProject(url, id, account.authenticator);
if(attach) { if(attach) {
return RESULT_OK; return BOINCErrors.ERR_OK;
} else { } else {
Log.d(TAG,"attachProject failed");
// happens if project already attached
return null; return null;
} }
} else { // error code } else { // error code
@ -374,7 +408,7 @@ public class AttachProjectLoginActivity extends Activity{
@Override @Override
protected void onPostExecute(Integer errorCode) { protected void onPostExecute(Integer errorCode) {
showResultToast(errorCode); showResultToast(errorCode);
if(errorCode == RESULT_OK) { //successful if((errorCode != null) && (errorCode == BOINCErrors.ERR_OK)) { //successful
monitor.forceRefresh(); // force refresh, so "no project banner" disappears monitor.forceRefresh(); // force refresh, so "no project banner" disappears
goToMainActivity(); goToMainActivity();
} }

View File

@ -36,6 +36,7 @@ import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import edu.berkeley.boinc.rpc.AccountOut; import edu.berkeley.boinc.rpc.AccountOut;
import edu.berkeley.boinc.utils.BOINCErrors;
public class AttachProjectRegistrationActivity extends Activity{ public class AttachProjectRegistrationActivity extends Activity{
@ -48,13 +49,6 @@ public class AttachProjectRegistrationActivity extends Activity{
private String projectName; private String projectName;
private Integer minPwdLength; private Integer minPwdLength;
// result definitions
public final static int RESULT_OK = 0;
public final static int RESULT_PWD_INCORRECT = -206;
public final static int RESULT_EMAIL_INCORRECT = -136;
public final static int RESULT_NO_CONNECTION = -113;
public final static int RESULT_USER_NAME_REQUIRED = -188;
private ServiceConnection mConnection = new ServiceConnection() { private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) { public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been established, getService returns the Monitor object that is needed to call functions. // This is called when the connection with the service has been established, getService returns the Monitor object that is needed to call functions.
@ -159,31 +153,42 @@ public class AttachProjectRegistrationActivity extends Activity{
} }
private void showResultToast(Integer code) { private void showResultToast(Integer code) {
Log.d(TAG,"showResultToast for error: " + code);
Toast toast; Toast toast;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
if(code == null) { if(code == null) {
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG); toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
} } else {
Log.d(TAG,"showResultToast for error: " + code); switch (code) {
switch (code) { case BOINCErrors.ERR_OK:
case RESULT_OK: toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_login_successful, Toast.LENGTH_LONG);
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_login_successful, Toast.LENGTH_LONG); break;
break; case BOINCErrors.ERR_NONUNIQUE_EMAIL: // treat the same as -137, ERR_DB_NOT_UNIQUE
case RESULT_PWD_INCORRECT: // no break!!
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_pwd, Toast.LENGTH_LONG); case BOINCErrors.ERR_DB_NOT_UNIQUE:
break; toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_email_in_use, Toast.LENGTH_LONG);
case RESULT_EMAIL_INCORRECT: break;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_wrong_name, Toast.LENGTH_LONG); case BOINCErrors.ERR_PROJECT_DOWN:
break; toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_project_down, Toast.LENGTH_LONG);
case RESULT_NO_CONNECTION: break;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_internet, Toast.LENGTH_LONG); case BOINCErrors.ERR_BAD_EMAIL_ADDR:
break; toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_email_bad_syntax, Toast.LENGTH_LONG);
case RESULT_USER_NAME_REQUIRED: break;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_username_required, Toast.LENGTH_LONG); case BOINCErrors.ERR_BAD_PASSWD:
break; toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_bad_pwd, Toast.LENGTH_LONG);
default: break;
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG); case BOINCErrors.ERR_BAD_USER_NAME:
break; toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_bad_username, Toast.LENGTH_LONG);
break;
case BOINCErrors.ERR_GETHOSTBYNAME:
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_no_internet, Toast.LENGTH_LONG);
break;
case BOINCErrors.ERR_ACCT_CREATION_DISABLED:
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_registration_toast_error_creation_disabled, Toast.LENGTH_LONG);
break;
default:
toast = Toast.makeText(getApplicationContext(), R.string.attachproject_login_toast_error_unknown, Toast.LENGTH_LONG);
break;
}
} }
toast.show(); toast.show();
} }
@ -246,15 +251,17 @@ public class AttachProjectRegistrationActivity extends Activity{
AccountOut account = monitor.createAccount(projectUrl, email, user, pwd, team); AccountOut account = monitor.createAccount(projectUrl, email, user, pwd, team);
if(account == null) { if(account == null) {
Log.d(TAG, "createAccount returned null");
return null; return null;
} }
if(account.error_num == RESULT_OK) { //only continue if creation succeeded if(account.error_num == BOINCErrors.ERR_OK) { //only continue if creation succeeded
publishProgress(); publishProgress();
Boolean attach = monitor.attachProject(projectUrl, email, account.authenticator); Boolean attach = monitor.attachProject(projectUrl, email, account.authenticator);
if(attach) { if(attach) {
return RESULT_OK; return BOINCErrors.ERR_OK;
} else { } else {
Log.d(TAG, "attachProject returned false");
return null; return null;
} }
} else { // error code } else { // error code
@ -272,7 +279,7 @@ public class AttachProjectRegistrationActivity extends Activity{
@Override @Override
protected void onPostExecute(Integer errorCode) { protected void onPostExecute(Integer errorCode) {
showResultToast(errorCode); showResultToast(errorCode);
if(errorCode == RESULT_OK) { //successful if((errorCode != null) && (errorCode == BOINCErrors.ERR_OK)) { //successful
monitor.forceRefresh(); // force refresh, so "no project banner" disappears monitor.forceRefresh(); // force refresh, so "no project banner" disappears
goToMainActivity(); goToMainActivity();
} }

View File

@ -29,9 +29,16 @@ public class BOINCErrors {
// old error numbers to avoid confusion between versions. // old error numbers to avoid confusion between versions.
// Add a text description of your error to boincerror() in util.C. // Add a text description of your error to boincerror() in util.C.
// //
public final static int ERR_OK = 0;
public final static int ERR_GETHOSTBYNAME = -113; // can not resolve name. no DNS -> no Internet?!
public static final int ERR_GIVEUP_DOWNLOAD = -114; public static final int ERR_GIVEUP_DOWNLOAD = -114;
public static final int ERR_GIVEUP_UPLOAD = -115; public static final int ERR_GIVEUP_UPLOAD = -115;
public final static int ERR_DB_NOT_FOUND = -136; // e.g. eMail invalid
public final static int ERR_DB_NOT_UNIQUE = -137; // name not unique, i.e. email already in use
public final static int ERR_PROJECT_DOWN = -183; // i.e. project error
public final static int ERR_BAD_USER_NAME = -188; // i.e. user name required
public final static int ERR_BAD_EMAIL_ADDR = -205; // i.e. email has invalid syntax
public final static int ERR_BAD_PASSWD = -206;
public final static int ERR_NONUNIQUE_EMAIL = -207;
public final static int ERR_ACCT_CREATION_DISABLED = -208; // i.e. account creation currently disabled
} }