diff --git a/docs-android/app/src/main/AndroidManifest.xml b/docs-android/app/src/main/AndroidManifest.xml
index 701027c1..27cf2761 100644
--- a/docs-android/app/src/main/AndroidManifest.xml
+++ b/docs-android/app/src/main/AndroidManifest.xml
@@ -51,6 +51,9 @@
android:name=".activity.AuditLogActivity"
android:label="@string/latest_activity">
+
+
diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java
index 71651d4c..391e9c81 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java
@@ -6,6 +6,7 @@ import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
+import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
@@ -23,7 +24,6 @@ import org.json.JSONObject;
* @author bgamard.
*/
public class AuditLogActivity extends AppCompatActivity {
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -64,6 +64,22 @@ public class AuditLogActivity extends AppCompatActivity {
}
});
+ // Navigate to user profile on click
+ final ListView auditLogListView = (ListView) findViewById(R.id.auditLogListView);
+ auditLogListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ if (auditLogListView.getAdapter() == null) {
+ return;
+ }
+ AuditLogListAdapter adapter = (AuditLogListAdapter) auditLogListView.getAdapter();
+ String username = adapter.getItem(position).optString("username");
+ Intent intent = new Intent(AuditLogActivity.this, UserProfileActivity.class);
+ intent.putExtra("username", username);
+ startActivity(intent);
+ }
+ });
+
// Get audit log list
refreshView(documentId);
}
diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java
index 31a71c29..884ef4bd 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java
@@ -59,7 +59,6 @@ import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.Date;
@@ -642,6 +641,7 @@ public class DocumentViewActivity extends AppCompatActivity {
menu.findItem(R.id.delete_file).setVisible(writable);
}
+ // Action only available if the document is writable
findViewById(R.id.actionEditDocument).setVisibility(writable ? View.VISIBLE : View.INVISIBLE);
findViewById(R.id.actionUploadFile).setVisibility(writable ? View.VISIBLE : View.INVISIBLE);
findViewById(R.id.actionSharing).setVisibility(writable ? View.VISIBLE : View.INVISIBLE);
@@ -649,11 +649,32 @@ public class DocumentViewActivity extends AppCompatActivity {
// ACLs
ListView aclListView = (ListView) findViewById(R.id.aclListView);
- aclListView.setAdapter(new AclListAdapter(document.optJSONArray("acls")));
+ final AclListAdapter aclListAdapter = new AclListAdapter(document.optJSONArray("acls"));
+ aclListView.setAdapter(aclListAdapter);
+ aclListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ AclListAdapter.AclItem acl = aclListAdapter.getItem(position);
+ if (acl.getType().equals("USER")) {
+ Intent intent = new Intent(DocumentViewActivity.this, UserProfileActivity.class);
+ intent.putExtra("username", acl.getName());
+ startActivity(intent);
+ }
+ }
+ });
// Remaining metadata
TextView creatorTextView = (TextView) findViewById(R.id.creatorTextView);
- creatorTextView.setText(document.optString("creator"));
+ final String creator = document.optString("creator");
+ creatorTextView.setText(creator);
+ creatorTextView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(DocumentViewActivity.this, UserProfileActivity.class);
+ intent.putExtra("username", creator);
+ startActivity(intent);
+ }
+ });
}
});
}
diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java
new file mode 100644
index 00000000..af979fc3
--- /dev/null
+++ b/docs-android/app/src/main/java/com/sismics/docs/activity/UserProfileActivity.java
@@ -0,0 +1,93 @@
+package com.sismics.docs.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.PreferenceGroup;
+import android.support.v7.app.AppCompatActivity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.sismics.docs.R;
+import com.sismics.docs.listener.HttpCallback;
+import com.sismics.docs.model.application.ApplicationContext;
+import com.sismics.docs.resource.UserResource;
+
+import org.json.JSONObject;
+
+/**
+ * User profile activity.
+ *
+ * @author bgamard.
+ */
+public class UserProfileActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Check if logged in
+ if (!ApplicationContext.getInstance().isLoggedIn()) {
+ startActivity(new Intent(this, LoginActivity.class));
+ finish();
+ return;
+ }
+
+ // Handle activity context
+ if (getIntent() == null) {
+ finish();
+ return;
+ }
+
+ // Input username
+ final String username = getIntent().getStringExtra("username");
+ if (username == null) {
+ finish();
+ return;
+ }
+
+ // Setup the activity
+ setTitle(username);
+ setContentView(R.layout.userprofile_activity);
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setHomeButtonEnabled(true);
+ }
+
+ // Get the user and populate the view
+ final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
+ final View layoutView = findViewById(R.id.layout);
+ progressBar.setVisibility(View.VISIBLE);
+ layoutView.setVisibility(View.GONE);
+ UserResource.get(this, username, new HttpCallback() {
+ @Override
+ public void onSuccess(JSONObject json) {
+ TextView emailTextView = (TextView) findViewById(R.id.emailTextView);
+ emailTextView.setText(json.optString("email"));
+
+ TextView quotaTextView = (TextView) findViewById(R.id.quotaTextView);
+ quotaTextView.setText(getString(R.string.storage_display,
+ Math.round(json.optLong("storage_current") / 1000000),
+ Math.round(json.optLong("storage_quota") / 1000000)));
+ }
+
+ @Override
+ public void onFinish() {
+ progressBar.setVisibility(View.GONE);
+ layoutView.setVisibility(View.VISIBLE);
+ }
+ });
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java
index 3ae874c7..bae59bf0 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/AclListAdapter.java
@@ -98,11 +98,19 @@ public class AclListAdapter extends BaseAdapter {
* An ACL item in the list.
* Permissions are grouped together.
*/
- private static class AclItem {
+ public static class AclItem {
private String type;
private String name;
private List permList = new ArrayList<>();
+ public String getType() {
+ return type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
@Override
public int hashCode() {
return (type + name).hashCode();
diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java
index 3d35564a..79b245a1 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java
@@ -53,6 +53,23 @@ public class UserResource extends BaseResource {
.newCall(request)
.enqueue(HttpCallback.buildOkHttpCallback(callback));
}
+
+ /**
+ * GET /user/username.
+ *
+ * @param context Context
+ * param username Username
+ * @param callback Callback
+ */
+ public static void get(Context context, String username, HttpCallback callback) {
+ Request request = new Request.Builder()
+ .url(HttpUrl.parse(getApiUrl(context) + "/user/" + username))
+ .get()
+ .build();
+ OkHttpUtil.buildClient(context)
+ .newCall(request)
+ .enqueue(HttpCallback.buildOkHttpCallback(callback));
+ }
/**
* POST /user/logout.
diff --git a/docs-android/app/src/main/res/layout/auditlog_activity.xml b/docs-android/app/src/main/res/layout/auditlog_activity.xml
index 524d2eb1..77680ad6 100644
--- a/docs-android/app/src/main/res/layout/auditlog_activity.xml
+++ b/docs-android/app/src/main/res/layout/auditlog_activity.xml
@@ -12,6 +12,8 @@
android:id="@+id/auditLogListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:choiceMode="singleChoice"
+ android:dividerHeight="0dp"
android:visibility="gone">
diff --git a/docs-android/app/src/main/res/layout/auditlog_list_item.xml b/docs-android/app/src/main/res/layout/auditlog_list_item.xml
index c24cff2a..242401cd 100644
--- a/docs-android/app/src/main/res/layout/auditlog_list_item.xml
+++ b/docs-android/app/src/main/res/layout/auditlog_list_item.xml
@@ -4,8 +4,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
- android:clickable="true"
- android:focusable="true"
android:background="?android:attr/selectableItemBackground">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs-android/app/src/main/res/values/strings.xml b/docs-android/app/src/main/res/values/strings.xml
index be8ebbfa..e1270599 100644
--- a/docs-android/app/src/main/res/values/strings.xml
+++ b/docs-android/app/src/main/res/values/strings.xml
@@ -128,5 +128,8 @@
Sismics Docs PDF export
Latest activity
Activity
+ E-mail
+ Storage quota
+ %1$d/%2$d MB