Add features for filtering reports

This commit is contained in:
tom79 2019-06-20 16:33:29 +02:00
parent 475f080dd7
commit 8b7c5a49e8
9 changed files with 145 additions and 18 deletions

View File

@ -18,11 +18,15 @@ import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
@ -43,6 +47,9 @@ import app.fedilab.android.helper.Helper;
public class AdminActivity extends BaseActivity {
private boolean unresolved;
private boolean local, remote, active, pending, disabled, silenced, suspended;
private DisplayAdminReportsFragment displayAdminReportsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -71,7 +78,7 @@ public class AdminActivity extends BaseActivity {
toolbar_title.setText(String.format(getString(R.string.administration)+ " %s", Helper.getLiveInstance(getApplicationContext())));
}
setContentView(R.layout.activity_admin);
unresolved = true;
ViewPager admin_viewpager = findViewById(R.id.admin_viewpager);
@ -80,6 +87,60 @@ public class AdminActivity extends BaseActivity {
admin_tablayout.addTab(admin_tablayout.newTab().setText(getString(R.string.accounts)));
final LinearLayout tabStrip = (LinearLayout) admin_tablayout.getChildAt(0);
tabStrip.getChildAt(0).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
PopupMenu popup = new PopupMenu(AdminActivity.this, tabStrip.getChildAt(0));
popup.getMenuInflater()
.inflate(R.menu.option_filter_admin_reports, popup.getMenu());
Menu menu = popup.getMenu();
final MenuItem itemUnresolved = menu.findItem(R.id.action_unresolved_reports);
itemUnresolved.setChecked(unresolved);
popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
@Override
public void onDismiss(PopupMenu menu) {
if( displayAdminReportsFragment != null)
displayAdminReportsFragment.refreshFilter();
}
});
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
item.setActionView(new View(getApplicationContext()));
item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
});
if (item.getItemId() == R.id.action_unresolved_reports) {
unresolved = !unresolved;
}
if( admin_tablayout.getTabAt(0) != null)
//noinspection ConstantConditions
admin_tablayout.getTabAt(0).select();
PagerAdapter mPagerAdapter = new AdminPagerAdapter(getSupportFragmentManager());
admin_viewpager.setAdapter(mPagerAdapter);
itemUnresolved.setChecked(unresolved);
return true;
}
});
popup.show();
return true;
}
});
PagerAdapter mPagerAdapter = new AdminPagerAdapter(getSupportFragmentManager());
admin_viewpager.setAdapter(mPagerAdapter);
@ -121,7 +182,7 @@ public class AdminActivity extends BaseActivity {
switch (tab.getPosition()){
case 0:
if( fragment != null) {
DisplayAdminReportsFragment displayAdminReportsFragment = ((DisplayAdminReportsFragment) fragment);
displayAdminReportsFragment = ((DisplayAdminReportsFragment) fragment);
displayAdminReportsFragment.scrollToTop();
}
break;
@ -151,6 +212,9 @@ public class AdminActivity extends BaseActivity {
switch (position){
case 0:
DisplayAdminReportsFragment displayAdminReportsFragment = new DisplayAdminReportsFragment();
bundle = new Bundle();
bundle.putBoolean("unresolved",unresolved);
displayAdminReportsFragment.setArguments(bundle);
return displayAdminReportsFragment;
case 1:
DisplayAdminAccountsFragment displayAdminAccountsFragment = new DisplayAdminAccountsFragment();

View File

@ -58,7 +58,7 @@ public class PostAdminActionAsyncTask extends AsyncTask<Void, Void, Void> {
case GET_ONE_ACCOUNT:
case GET_REPORTS:
case GET_ONE_REPORT:
apiResponse = new API(contextReference.get()).adminGet(action, id, null);
apiResponse = new API(contextReference.get()).adminGet(action, id, adminAction);
break;
default:
apiResponse = new API(contextReference.get()).adminDo(action, id, adminAction);

View File

@ -19,6 +19,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@ -136,6 +137,7 @@ public class API {
GET_ONE_REPORT
}
public enum StatusAction{
FAVOURITE,
UNFAVOURITE,
@ -171,12 +173,15 @@ public class API {
UPDATESERVERSCHEDULE,
DELETESCHEDULED,
REFRESHPOLL
}
public enum accountPrivacy {
PUBLIC,
LOCKED
}
public API(Context context) {
this.context = context;
if( context == null) {
@ -207,16 +212,15 @@ public class API {
}
/**
* Execute admin get actions
* @param action type of the action
* @param id String can for an account or a status
* @return APIResponse
*/
public APIResponse adminGet(adminAction action, String id, HashMap<String, String> params){
public APIResponse adminGet(adminAction action, String id, AdminAction adminAction){
apiResponse = new APIResponse();
HashMap<String, String> params = null;
String endpoint = null;
switch (action){
case GET_ACCOUNTS:
@ -227,13 +231,19 @@ public class API {
break;
case GET_REPORTS:
endpoint = "/admin/reports";
if( !adminAction.isUnresolved()) {
params = new HashMap<>();
params.put("resolved", "present");
}
break;
case GET_ONE_REPORT:
endpoint = String.format("/admin/reports/%s", id);
break;
}
try {
Log.v(Helper.TAG,"params: " + params);
String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl(endpoint), 60, params, prefKeyOauthTokenT);
Log.v(Helper.TAG,"response: " + response);
switch (action){
case GET_ACCOUNTS:
List<AccountAdmin> accountAdmins = parseAccountAdminResponse(new JSONArray(response));

View File

@ -26,8 +26,17 @@ public class AdminAction {
private adminActionType type;
private boolean send_email_notification;
private String text;
private boolean unresolved;
public boolean isUnresolved() {
return unresolved;
}
public void setUnresolved(boolean unresolved) {
this.unresolved = unresolved;
}
public adminActionType getType() {
return type;
}

View File

@ -48,6 +48,7 @@ import app.fedilab.android.asynctasks.PostAdminActionAsyncTask;
import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask;
import app.fedilab.android.client.API;
import app.fedilab.android.client.APIResponse;
import app.fedilab.android.client.Entities.AdminAction;
import app.fedilab.android.client.Entities.Report;
import app.fedilab.android.drawers.ReportsListAdapter;
import app.fedilab.android.helper.Helper;
@ -73,7 +74,7 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
private SwipeRefreshLayout swipeRefreshLayout;
private boolean swiped;
private RecyclerView lv_reports;
private boolean unresolved;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -83,6 +84,10 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
reports = new ArrayList<>();
Bundle bundle = this.getArguments();
if (bundle != null) {
unresolved = bundle.getBoolean("unresolved", true);
}
max_id = null;
firstLoad = true;
flag_loading = true;
@ -112,7 +117,9 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
if (firstVisibleItem + visibleItemCount == totalItemCount) {
if (!flag_loading) {
flag_loading = true;
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, null, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
AdminAction adminAction = new AdminAction();
adminAction.setUnresolved(unresolved);
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, adminAction, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
nextElementLoader.setVisibility(View.VISIBLE);
}
} else {
@ -130,7 +137,9 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
firstLoad = true;
flag_loading = true;
swiped = true;
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, null, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
AdminAction adminAction = new AdminAction();
adminAction.setUnresolved(unresolved);
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, adminAction, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
@ -155,8 +164,9 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
swipeRefreshLayout.setProgressBackgroundColorSchemeColor(ContextCompat.getColor(context, R.color.black_3));
break;
}
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, null, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
AdminAction adminAction = new AdminAction();
adminAction.setUnresolved(unresolved);
asyncTask = new PostAdminActionAsyncTask(context, API.adminAction.GET_REPORTS, null, adminAction, DisplayAdminReportsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
return rootView;
}
@ -167,6 +177,12 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi
}
/**
* Refresh report in list
*/
public void refreshFilter(){
reportsListAdapter.notifyDataSetChanged();
}
@Override
public void onAttach(Context context) {

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_unresolved_reports"
android:checkable="true"
android:checked="true"
android:title="@string/unresolved"
app:actionViewClass="android.widget.CheckBox"
app:showAsAction="always"
tools:ignore="AlwaysShowAction" />
</menu>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_unresolved_reports"
android:checkable="true"
android:checked="true"
android:title="@string/unresolved"
app:actionViewClass="android.widget.CheckBox"
app:showAsAction="always"
tools:ignore="AlwaysShowAction" />
</menu>

View File

@ -1033,6 +1033,8 @@
<string name="no_reports">No reports to display!</string>
<string name="reconnect_account">Reconnect the account</string>
<string name="reconnect_account_message">The application failed to access the admin features. You might need to reconnect the account for having the correct scope.</string>
<string name="unresolved">Unresolved</string>
<string name="resolved">Resolved</string>
<plurals name="number_of_vote">
<item quantity="one">%d vote</item>
<item quantity="other">%d votes</item>

View File

@ -395,7 +395,7 @@
<!-- Light theme -->
<style name="AppAdminTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<style name="AppAdminTheme" parent="Theme.AppCompat">
<item name="android:textColor">@color/dark_text</item>
<item name="colorPrimary">@color/mastodonC1</item>
<item name="colorPrimaryDark">@color/mastodonC1</item>
@ -410,13 +410,13 @@
<item name="borderless">@style/borderLessLightStyle</item>
<item name="borderlessColored">@style/borderlessColoredStyle</item>
<item name="windowActionModeOverlay">true</item>
<item name="popupOverlay">@style/AppTheme.PopupOverlay</item>
<item name="popupOverlay">@style/AppThemeDark.PopupOverlay</item>
<item name="android:spinnerStyle">@style/SpinnerStyle</item>
<item name="android:spinnerItemStyle">@style/SpinnerItemStyle</item>
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:itemBackground">@drawable/menu_selector</item>
<item name="android:actionModeStyle">@style/ActionMode</item>
<item name="android:dropDownListViewStyle">@style/DropDownListViewStyle</item>
<item name="android:popupMenuStyle">@style/DarkPopupMenu</item>
<item name="android:itemBackground">@drawable/menu_selector_dark</item>
<item name="android:actionModeStyle">@style/DarkActionMode</item>
<item name="android:dropDownListViewStyle">@style/DarkdropDownListViewStyle</item>
<item name="actionBarTextColor">@color/dark_text</item>
<item name="color_in_account_header">@color/black</item>
<item name="colorBackgroundFloating">@color/mastodonC1__</item>