diff --git a/android/BOINC/res/drawable-hdpi/attentionb.png b/android/BOINC/res/drawable-hdpi/attentionb.png
new file mode 100644
index 0000000000..f098f8af16
Binary files /dev/null and b/android/BOINC/res/drawable-hdpi/attentionb.png differ
diff --git a/android/BOINC/res/drawable-ldpi/attentionb.png b/android/BOINC/res/drawable-ldpi/attentionb.png
new file mode 100644
index 0000000000..aa7398c928
Binary files /dev/null and b/android/BOINC/res/drawable-ldpi/attentionb.png differ
diff --git a/android/BOINC/res/drawable-mdpi/attentionb.png b/android/BOINC/res/drawable-mdpi/attentionb.png
new file mode 100644
index 0000000000..8b4b4c1709
Binary files /dev/null and b/android/BOINC/res/drawable-mdpi/attentionb.png differ
diff --git a/android/BOINC/res/layout/attach_project_list_layout_manual_dialog.xml b/android/BOINC/res/layout/attach_project_list_layout_manual_dialog.xml
index 16f4898249..9cd5bf3d7f 100644
--- a/android/BOINC/res/layout/attach_project_list_layout_manual_dialog.xml
+++ b/android/BOINC/res/layout/attach_project_list_layout_manual_dialog.xml
@@ -17,25 +17,42 @@
You should have received a copy of the GNU Lesser General Public License
along with BOINC. If not, see .
-->
-
+
+
+
+ android:id="@+id/Input"
+ android:layout_width="200dp"
+ android:layout_height="wrap_content"
+ android:inputType="textUri"
+ android:layout_margin="5dp">
-
-
+ android:background="@drawable/shape_button_blue"
+ android:textColor="@color/white_smoke"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:padding="5dp"
+ android:layout_gravity="center_horizontal"
+ android:clickable="true"
+ android:layout_margin="5dp"
+ android:text="@string/attachproject_list_manual_dialog_button"/>
+
\ No newline at end of file
diff --git a/android/BOINC/res/layout/dialog_confirm.xml b/android/BOINC/res/layout/dialog_confirm.xml
new file mode 100644
index 0000000000..ca4e919a53
--- /dev/null
+++ b/android/BOINC/res/layout/dialog_confirm.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/BOINC/res/layout/dialog_list.xml b/android/BOINC/res/layout/dialog_list.xml
new file mode 100644
index 0000000000..b20ce8d2d9
--- /dev/null
+++ b/android/BOINC/res/layout/dialog_list.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/android/BOINC/res/layout/dialog_list_item.xml b/android/BOINC/res/layout/dialog_list_item.xml
new file mode 100644
index 0000000000..82a415df55
--- /dev/null
+++ b/android/BOINC/res/layout/dialog_list_item.xml
@@ -0,0 +1,28 @@
+
+
+
diff --git a/android/BOINC/res/values/strings.xml b/android/BOINC/res/values/strings.xml
index 8fa3f6094b..7f782e1c86 100644
--- a/android/BOINC/res/values/strings.xml
+++ b/android/BOINC/res/values/strings.xml
@@ -38,8 +38,8 @@
Loading supported projects…
Choose a project:
Add project by URL
- Enter URL of scientific project:
- >
+ Enter project URL:
+ Add project
Please enter project URL!
No internet connection!
@@ -208,11 +208,10 @@
Remove project
- Remove project:
+ Are you sure to remove
+ from BOINC?
Remove
- Cancel
- Project operation
- Choose an operation to execute:
+ Project operations:
Reading tasks…
@@ -244,7 +243,8 @@
Abort task
Abort task:
Abort
- Cancel
+ Cancel
+ Confirmation dialog
Reading transfers…
diff --git a/android/BOINC/src/edu/berkeley/boinc/AttachProjectListActivity.java b/android/BOINC/src/edu/berkeley/boinc/AttachProjectListActivity.java
index 1ec81500dc..f53a78a32c 100644
--- a/android/BOINC/src/edu/berkeley/boinc/AttachProjectListActivity.java
+++ b/android/BOINC/src/edu/berkeley/boinc/AttachProjectListActivity.java
@@ -40,6 +40,7 @@ import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
+import android.widget.TextView;
import android.widget.Toast;
public class AttachProjectListActivity extends Activity implements android.view.View.OnClickListener{
@@ -135,10 +136,11 @@ public class AttachProjectListActivity extends Activity implements android.view.
@Override
protected Dialog onCreateDialog(int id) {
manualUrlInputDialog = new Dialog(this); //instance new dialog
+ manualUrlInputDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
manualUrlInputDialog.setContentView(R.layout.attach_project_list_layout_manual_dialog);
Button button = (Button) manualUrlInputDialog.findViewById(R.id.buttonUrlSubmit);
button.setOnClickListener(this);
- manualUrlInputDialog.setTitle(R.string.attachproject_list_manual__dialog_title);
+ ((TextView)manualUrlInputDialog.findViewById(R.id.title)).setText(R.string.attachproject_list_manual_dialog_title);
return manualUrlInputDialog;
}
diff --git a/android/BOINC/src/edu/berkeley/boinc/ProjectsActivity.java b/android/BOINC/src/edu/berkeley/boinc/ProjectsActivity.java
index 3b7e8f04be..6a89f164ea 100644
--- a/android/BOINC/src/edu/berkeley/boinc/ProjectsActivity.java
+++ b/android/BOINC/src/edu/berkeley/boinc/ProjectsActivity.java
@@ -20,16 +20,12 @@ package edu.berkeley.boinc;
import java.util.ArrayList;
import java.util.Iterator;
-import edu.berkeley.boinc.adapter.ProjectsListAdapter;
-import edu.berkeley.boinc.client.Monitor;
-import edu.berkeley.boinc.rpc.Project;
-import edu.berkeley.boinc.rpc.RpcClient;
-import android.app.AlertDialog;
+
+import android.app.Dialog;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
@@ -43,8 +39,17 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
+import edu.berkeley.boinc.adapter.ProjectsListAdapter;
+import edu.berkeley.boinc.client.Monitor;
+import edu.berkeley.boinc.rpc.Project;
+import edu.berkeley.boinc.rpc.RpcClient;
+import android.widget.ArrayAdapter;
public class ProjectsActivity extends FragmentActivity {
@@ -52,7 +57,7 @@ public class ProjectsActivity extends FragmentActivity {
private final String TAG = "BOINC ProjectsActivity";
private Monitor monitor;
- private Boolean mIsBound;
+ private Boolean mIsBound = false;
private ListView lv;
private ProjectsListAdapter listAdapter;
@@ -68,11 +73,13 @@ public class ProjectsActivity extends FragmentActivity {
// getService returns the Monitor object that is needed to call functions.
//
private ServiceConnection mConnection = new ServiceConnection() {
+ @Override
public void onServiceConnected(ComponentName className, IBinder service) {
monitor = ((Monitor.LocalBinder)service).getService();
mIsBound = true;
+ Log.d(TAG,"service bound");
}
-
+ @Override
public void onServiceDisconnected(ComponentName className) {
monitor = null;
mIsBound = false;
@@ -100,7 +107,7 @@ public class ProjectsActivity extends FragmentActivity {
// Establish a connection with the service, onServiceConnected gets called when
// (calling within Tab needs getApplicationContext() for bindService to work!)
- getApplicationContext().bindService(new Intent(this, Monitor.class), mConnection, Service.START_STICKY_COMPATIBILITY);
+ getApplicationContext().bindService(new Intent(this, Monitor.class), mConnection, Service.START_STICKY_COMPATIBILITY);
}
@Override
@@ -272,19 +279,72 @@ public class ProjectsActivity extends FragmentActivity {
new ProjectOperationAsync().execute(project.master_url, operation.toString());
break;
case RpcClient.PROJECT_DETACH:
- ConfirmationDialog cd = ConfirmationDialog.newInstance(
- getString(R.string.projects_confirm_detach_title) + "?",
- getString(R.string.projects_confirm_detach_message) + " " + project.project_name,
- getString(R.string.projects_confirm_detach_confirm));
- cd.setConfirmationClicklistener(new DialogInterface.OnClickListener() {
+ final Dialog dialog = new Dialog(activity);
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialog.setContentView(R.layout.dialog_confirm);
+ ((TextView)dialog.findViewById(R.id.title)).setText(R.string.projects_confirm_detach_title);
+ ((TextView)dialog.findViewById(R.id.message)).setText(getString(R.string.projects_confirm_detach_message) + " "
+ + project.project_name + " " + getString(R.string.projects_confirm_detach_message2));
+ Button confirm = (Button) dialog.findViewById(R.id.confirm);
+ confirm.setText(R.string.projects_confirm_detach_confirm);
+ confirm.setOnClickListener(new OnClickListener() {
@Override
- public void onClick(DialogInterface dialog, int which) {
+ public void onClick(View v) {
new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_DETACH);
+ dialog.dismiss();
}
});
- cd.show(getSupportFragmentManager(), "");
+ Button cancel = (Button) dialog.findViewById(R.id.cancel);
+ cancel.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
break;
case RpcClient.PROJECT_ADVANCED:
+ final Dialog dialogAdvanced = new Dialog(activity);
+ dialogAdvanced.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialogAdvanced.setContentView(R.layout.dialog_list);
+ ((TextView)dialogAdvanced.findViewById(R.id.title)).setText(R.string.projects_confirm_advanced_title);
+ ListView list = (ListView)dialogAdvanced.findViewById(R.id.options);
+ String[] controls = getResources().getStringArray(R.array.projects_advanced_controls);
+ list.setAdapter(new ArrayAdapter(activity,R.layout.dialog_list_item,controls));
+ list.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> arg0, View v, int position, long id) {
+ switch(position) {
+ case 0:
+ new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_SUSPEND);
+ break;
+ case 1:
+ new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_RESUME);
+ break;
+ case 2:
+ new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_NNW);
+ break;
+ case 3:
+ new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_ANW);
+ break;
+ case 4:
+ new ProjectOperationAsync().execute(project.master_url, ""+RpcClient.PROJECT_RESET);
+ break;
+ default:
+ break;
+ }
+ dialogAdvanced.dismiss();
+ }});
+ Button cancelButton = (Button) dialogAdvanced.findViewById(R.id.cancel);
+ cancelButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialogAdvanced.dismiss();
+ }
+ });
+ dialogAdvanced.show();
+
+ /*
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.projects_confirm_advanced_title);
builder.setItems(R.array.projects_advanced_controls, new DialogInterface.OnClickListener() {
@@ -309,13 +369,13 @@ public class ProjectsActivity extends FragmentActivity {
break;
}
}});
- builder.create().show();
+ builder.create().show(); */
break;
default:
Log.w(TAG,"could not map operation tag");
}
listAdapter.notifyDataSetChanged(); //force list adapter to refresh
- } catch (Exception e) {Log.w(TAG,"failed parsing view tag");}
+ } catch (Exception e) {Log.w(TAG,"onclick failed",e);}
}
};
}
@@ -329,7 +389,7 @@ public class ProjectsActivity extends FragmentActivity {
try{
String url = params[0];
Integer operation = Integer.parseInt(params[1]);
- Log.d(TAG,"url: " + url + " operation: " + operation);
+ Log.d(TAG,"url: " + url + " operation: " + operation + " monitor bound: " + mIsBound);
if(mIsBound) return monitor.projectOperation(operation, url);
else return false;
diff --git a/android/BOINC/src/edu/berkeley/boinc/client/ClientNotification.java b/android/BOINC/src/edu/berkeley/boinc/client/ClientNotification.java
index 05c91174ce..750adeacb1 100644
--- a/android/BOINC/src/edu/berkeley/boinc/client/ClientNotification.java
+++ b/android/BOINC/src/edu/berkeley/boinc/client/ClientNotification.java
@@ -51,7 +51,7 @@ public class ClientNotification {
public synchronized void update() {
// check whether notification is allowed in preferences
if (!Monitor.getAppPrefs().getShowNotification()) {
- Log.d(TAG,"cancelling notification");
+ //Log.d(TAG,"cancelling notification");
nm.cancel(notificationId);
return;
}
diff --git a/android/BOINC/src/edu/berkeley/boinc/rpc/RpcClient.java b/android/BOINC/src/edu/berkeley/boinc/rpc/RpcClient.java
index 63d8290c1c..64574d8d81 100644
--- a/android/BOINC/src/edu/berkeley/boinc/rpc/RpcClient.java
+++ b/android/BOINC/src/edu/berkeley/boinc/rpc/RpcClient.java
@@ -759,11 +759,11 @@ public class RpcClient {
if(accountIn.email_addr == null || accountIn.email_addr.isEmpty()) id = accountIn.user_name;
else id = accountIn.email_addr;
mRequest.setLength(0);
- mRequest.append("\n ");
+ mRequest.append("\n ");
mRequest.append(accountIn.url);
- mRequest.append("\n ");
+ mRequest.append("\n ");
mRequest.append(id);
- mRequest.append("\n ");
+ mRequest.append("\n ");
mRequest.append(getPasswdHash(accountIn.passwd, id));
mRequest.append("\n\n");
sendRequest(mRequest.toString());