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