Add instances picker

This commit is contained in:
Thomas 2020-10-27 16:58:40 +01:00
parent fe610b7ecb
commit a9281c1585
13 changed files with 156 additions and 80 deletions

View File

@ -17,15 +17,16 @@ package app.fedilab.mobilizon;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
@ -47,8 +48,8 @@ public class InstancePickerActivity extends AppCompatActivity {
private boolean flag_loading;
private String max_id;
private Search search;
private InstanceAdapter instanceAdapter;
private InstanceAdapter instanceAdapter;
private SearchInstancesVM searchInstancesVM;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -66,15 +67,13 @@ public class InstancePickerActivity extends AppCompatActivity {
search.setSort("-createdAt");
max_id = "0";
setContentView(R.layout.activity_instance_picker);
instances = new ArrayList<>();
binding.loader.setVisibility(View.VISIBLE);
binding.lvInstances.setVisibility(View.GONE);
flag_loading = true;
LinearLayoutManager mLayoutManager = new LinearLayoutManager(InstancePickerActivity.this);
SearchInstancesVM searchInstancesVM = new ViewModelProvider(InstancePickerActivity.this).get(SearchInstancesVM.class);
searchInstancesVM = new ViewModelProvider(InstancePickerActivity.this).get(SearchInstancesVM.class);
instanceAdapter = new InstanceAdapter(instances);
binding.lvInstances.setAdapter(instanceAdapter);
binding.lvInstances.setLayoutManager(mLayoutManager);
@ -99,10 +98,45 @@ public class InstancePickerActivity extends AppCompatActivity {
}
});
searchInstancesVM.get(search).observe(InstancePickerActivity.this, this::manageVIewInstance);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_instance, menu);
MenuItem myActionMenuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
max_id = "0";
if( query != null && query.trim().length() > 0) {
search.setSearch(query.trim());
}else{
search.setSearch(null);
}
LinearLayoutManager mLayoutManager = new LinearLayoutManager(InstancePickerActivity.this);
instanceAdapter = new InstanceAdapter(instances);
binding.lvInstances.setAdapter(instanceAdapter);
binding.lvInstances.setLayoutManager(mLayoutManager);
search.setStart(max_id);
binding.loader.setVisibility(View.VISIBLE);
binding.lvInstances.setVisibility(View.GONE);
searchInstancesVM.get(search).observe(InstancePickerActivity.this, instanceData -> manageVIewInstance(instanceData));
return false;
}
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
@ -116,7 +150,8 @@ public class InstancePickerActivity extends AppCompatActivity {
public void manageVIewInstance(InstanceData instanceData) {
binding.loader.setVisibility(View.GONE);
binding.loadingNextInstances.setVisibility(View.GONE);
if (instanceData == null || instanceData.data.size() == 0) {
flag_loading = false;
if (instanceData == null || (instanceData.data.size() == 0 && this.instances.size() == 0)) {
binding.noAction.setVisibility(View.VISIBLE);
binding.lvInstances.setVisibility(View.GONE);
return;

View File

@ -162,6 +162,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
@ -376,9 +378,19 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
this.mFilePathCallback = mFilePathCallback;
}
@SuppressLint("ApplySharedPref")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
if (requestCode == PICK_INSTANCE && resultCode == Activity.RESULT_OK) {
if (data != null && data.getData() != null) {
final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_INSTANCE, String.valueOf(data.getData()));
editor.commit();
recreate();
}
}
super.onActivityResult(requestCode, resultCode, data);
return;
}

View File

@ -29,7 +29,7 @@ public class RetrofitInstancesAPI {
private InstancesService init() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://instances.joinmobilizon.org/api/v1")
.baseUrl("https://instances.joinmobilizon.org/api/v1/")
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit.create(InstancesService.class);

View File

@ -73,7 +73,7 @@ public class InstanceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
holder.host.setText(instance.getHost());
holder.version.setText(instance.getVersion());
StringBuilder languages = new StringBuilder();
if (instance.getLanguages() != null && instance.getLanguages().size() > 0) {
@ -88,6 +88,9 @@ public class InstanceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
holder.languages.setVisibility(View.VISIBLE);
}
holder.version.setText(context.getString(R.string.version, String.valueOf(instance.getVersion())));
holder.users.setText(context.getString(R.string.users, String.valueOf(instance.getTotalUsers())));
holder.groups.setText(context.getString(R.string.groups, String.valueOf(instance.getTotalLocalGroups())));
holder.local_events.setText(context.getString(R.string.local_events, String.valueOf(instance.getTotalLocalEvents())));
holder.pickup.setOnClickListener(v -> {
@ -114,7 +117,7 @@ public class InstanceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
Button pickup;
TextView name, host, description;
TextView version, local_events, languages;
TextView version, local_events, languages, groups, users;
public ViewHolder(@NonNull View itemView) {
super(itemView);
@ -125,6 +128,8 @@ public class InstanceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
local_events = itemView.findViewById(R.id.local_events);
version = itemView.findViewById(R.id.version);
languages = itemView.findViewById(R.id.languages);
groups = itemView.findViewById(R.id.groups);
users = itemView.findViewById(R.id.users);
}
}
}

View File

@ -29,7 +29,6 @@ import java.io.InputStream;
* see <http://www.gnu.org/licenses>. */
public class Helper {
@SuppressWarnings("unused")
public static final String TAG = "mobilizon_app";
public static final String APP_PREFS = "app_prefs";
public static final String PREF_INSTANCE = "instance";
@ -42,7 +41,7 @@ public class Helper {
*/
public static String getLiveInstance(Context context) {
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
return sharedpreferences.getString(Helper.PREF_INSTANCE, "test.mobilizon.org");
return sharedpreferences.getString(Helper.PREF_INSTANCE, "mobilizon.fr");
}
/**
@ -82,7 +81,7 @@ public class Helper {
}
@SuppressWarnings({"ResultOfMethodCallIgnored", "unused"})
@SuppressWarnings({"ResultOfMethodCallIgnored"})
public static void injectCSS(Activity activity, WebView view, String cssFile) {
try {
InputStream inputStream = activity.getAssets().open(cssFile);

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,3h-1L19,1h-2v2L7,3L7,1L5,1v2L4,3c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,5c0,-1.1 -0.9,-2 -2,-2zM20,21L4,21L4,8h16v13z"/>
</vector>

View File

@ -1,10 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
</vector>

View File

@ -1,10 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
</vector>

View File

@ -15,7 +15,8 @@
You should have received a copy of the GNU General Public License along with Mobilizon app; if not,
see <http://www.gnu.org/licenses>.
-->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@ -29,26 +30,23 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/fab_margin">
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:id="@+id/filters_container"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/lv_instances"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:layout_marginStart="@dimen/fab_margin"
android:layout_marginEnd="@dimen/fab_margin"
app:layout_constraintBottom_toTopOf="@+id/loading_next_instances"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="10dp"
android:scrollbars="none" />
<androidx.appcompat.widget.SearchView
app:queryHint="@string/search_instance_hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:animateLayoutChanges="false"
android:id="@+id/searchBar" />
</androidx.cardview.widget.CardView>
<!-- Main Loader -->
<RelativeLayout
android:id="@+id/loader"
@ -60,8 +58,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/filters_container">
app:layout_constraintTop_toTopOf="parent">
<com.github.ybq.android.spinkit.SpinKitView
style="@style/progress"
android:layout_width="wrap_content"
@ -70,38 +67,27 @@
app:SpinKit_Color="?colorAccent" />
</RelativeLayout>
<LinearLayout
<RelativeLayout
android:id="@+id/no_action"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:orientation="vertical"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/filters_container">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/lv_instances"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="10dp"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" />
<RelativeLayout
android:id="@+id/no_action"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:padding="10dp"
android:text="@string/no_results"
android:textSize="25sp" />
</RelativeLayout>
</LinearLayout>
<!-- Loader for next videos -->
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:padding="10dp"
android:text="@string/no_results"
android:textSize="25sp" />
</RelativeLayout>
<!-- Loader for next instances -->
<RelativeLayout
android:id="@+id/loading_next_instances"
android:layout_width="match_parent"
@ -113,6 +99,7 @@
>
<com.github.ybq.android.spinkit.SpinKitView
style="@style/progressBottom"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -60,6 +60,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:drawablePadding="10dp"
app:drawableStartCompat="@drawable/ic_baseline_info_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/description" />
@ -69,10 +71,32 @@
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:drawablePadding="10dp"
app:drawableStartCompat="@drawable/ic_baseline_group_24"
app:drawableStartCompat="@drawable/ic_baseline_calendar_today_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/version" />
<TextView
android:id="@+id/groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:drawablePadding="10dp"
app:drawableStartCompat="@drawable/ic_baseline_group_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/local_events" />
<TextView
android:id="@+id/users"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:drawablePadding="10dp"
app:drawableStartCompat="@drawable/ic_baseline_people_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/groups" />
<TextView
android:id="@+id/languages"
android:layout_width="match_parent"
@ -81,7 +105,7 @@
android:drawablePadding="10dp"
app:drawableStartCompat="@drawable/ic_baseline_forum_24"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/local_events" />
app:layout_constraintTop_toBottomOf="@+id/users" />

View File

@ -0,0 +1,11 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="app.fedilab.mobilizon.MainActivity">
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView" />
</menu>

View File

@ -44,4 +44,7 @@
<string name="instances_picker">Instances picker</string>
<string name="pickup_instance">Pick this instance</string>
<string name="local_events">Local events: %1$s</string>
<string name="version">Version: %1$s</string>
<string name="groups">Groups: %1$s</string>
<string name="users">Users: %1$s</string>
</resources>