From 33c7f12180459807c95ae1902989933bfff4d420 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 16 Sep 2020 17:27:07 +0200 Subject: [PATCH] Open dialog --- app/src/acad/res/values/strings.xml | 7 + app/src/full/res/values/strings.xml | 6 + app/src/main/AndroidManifest.xml | 7 + .../fedilabtube/InstancePickerActivity.java | 110 ++++++++++++++++ .../app/fedilab/fedilabtube/MainActivity.java | 4 + .../fedilabtube/drawer/InstanceAdapter.java | 121 ++++++++++++++++++ .../fedilabtube/viewmodel/InstancesVM.java | 59 +++++++++ .../res/drawable/ic_baseline_forum_24.xml | 10 ++ .../res/drawable/ic_baseline_group_24.xml | 10 ++ .../res/layout/activity_instance_picker.xml | 84 ++++++++++++ .../main/res/layout/activity_playlists.xml | 2 +- app/src/main/res/layout/drawer_instance.xml | 103 +++++++++++++++ 12 files changed, 522 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/app/fedilab/fedilabtube/InstancePickerActivity.java create mode 100644 app/src/main/java/app/fedilab/fedilabtube/drawer/InstanceAdapter.java create mode 100644 app/src/main/java/app/fedilab/fedilabtube/viewmodel/InstancesVM.java create mode 100644 app/src/main/res/drawable/ic_baseline_forum_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_group_24.xml create mode 100644 app/src/main/res/layout/activity_instance_picker.xml create mode 100644 app/src/main/res/layout/drawer_instance.xml diff --git a/app/src/acad/res/values/strings.xml b/app/src/acad/res/values/strings.xml index 19eb5cb..2960119 100644 --- a/app/src/acad/res/values/strings.xml +++ b/app/src/acad/res/values/strings.xml @@ -220,4 +220,11 @@ Faire un don Code source Suivi des tickets + + No instances match these criteria + Instances picker + Pickup this instance + Sensitive content: %1$s + %1$s followers instances + Help diff --git a/app/src/full/res/values/strings.xml b/app/src/full/res/values/strings.xml index 2f779c0..764517d 100644 --- a/app/src/full/res/values/strings.xml +++ b/app/src/full/res/values/strings.xml @@ -238,4 +238,10 @@ Donate Source code Issue tracker + No instances match these criteria + Instances picker + Pickup this instance + Sensitive content: %1$s + %1$s followers instances + Help \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 64eadfc..e3b217a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,6 +65,13 @@ android:configChanges="orientation|screenSize" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysHidden" /> + + + . */ + +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import app.fedilab.fedilabtube.client.APIResponse; +import app.fedilab.fedilabtube.client.entities.Instance; +import app.fedilab.fedilabtube.client.entities.InstanceParams; +import app.fedilab.fedilabtube.drawer.InstanceAdapter; +import app.fedilab.fedilabtube.viewmodel.InstancesVM; +import es.dmoral.toasty.Toasty; + + +public class InstancePickerActivity extends AppCompatActivity { + + + LinearLayoutManager mLayoutManager; + private RelativeLayout mainLoader, textviewNoAction; + private List instances; + private InstanceAdapter instanceAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + + setContentView(R.layout.activity_instance_picker); + instances = new ArrayList<>(); + + RecyclerView lv_instances = findViewById(R.id.lv_instances); + mainLoader = findViewById(R.id.loader); + textviewNoAction = findViewById(R.id.no_action); + mainLoader.setVisibility(View.VISIBLE); + + + mainLoader.setVisibility(View.VISIBLE); + + instanceAdapter = new InstanceAdapter(this.instances); + + lv_instances.setAdapter(instanceAdapter); + mLayoutManager = new LinearLayoutManager(InstancePickerActivity.this); + lv_instances.setLayoutManager(mLayoutManager); + + + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + setTitle(R.string.instances_picker); + + InstancesVM viewModel = new ViewModelProvider(InstancePickerActivity.this).get(InstancesVM.class); + + viewModel.getInstances(new InstanceParams()).observe(InstancePickerActivity.this, this::manageVIewInstance); + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + + public void manageVIewInstance(APIResponse apiResponse) { + mainLoader.setVisibility(View.GONE); + //Discards 404 - error which can often happen due to toots which have been deleted + if (apiResponse.getError() != null) { + if (!apiResponse.getError().getError().startsWith("404 -") && !apiResponse.getError().getError().startsWith("501 -")) + Toasty.error(InstancePickerActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); + return; + } + List instances = apiResponse.getInstances(); + if ((instances == null || instances.size() == 0)) { + textviewNoAction.setVisibility(View.VISIBLE); + return; + } + this.instances.addAll(instances); + instanceAdapter.notifyItemRangeInserted(0, instances.size()); + } +} diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java index 47dd283..80d5231 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java @@ -298,6 +298,10 @@ public class MainActivity extends AppCompatActivity { }).start()); alt_bld.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + alt_bld.setNeutralButton(R.string.help, (dialog, which) -> { + Intent intent = new Intent(MainActivity.this, InstancePickerActivity.class); + startActivity(intent); + }); AlertDialog alert = alt_bld.create(); alert.show(); } diff --git a/app/src/main/java/app/fedilab/fedilabtube/drawer/InstanceAdapter.java b/app/src/main/java/app/fedilab/fedilabtube/drawer/InstanceAdapter.java new file mode 100644 index 0000000..ffcb58f --- /dev/null +++ b/app/src/main/java/app/fedilab/fedilabtube/drawer/InstanceAdapter.java @@ -0,0 +1,121 @@ +package app.fedilab.fedilabtube.drawer; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of TubeLab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with TubeLab; if not, + * see . */ + + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import app.fedilab.fedilabtube.R; +import app.fedilab.fedilabtube.client.entities.Instance; + +import static app.fedilab.fedilabtube.MainActivity.peertubeInformation; + + +public class InstanceAdapter extends RecyclerView.Adapter { + + private List instances; + + private Context context; + + public InstanceAdapter(List instances) { + this.instances = instances; + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + context = parent.getContext(); + LayoutInflater layoutInflater = LayoutInflater.from(context); + return new PeertubeAdapter.ViewHolder(layoutInflater.inflate(R.layout.drawer_instance, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { + final Instance instance = instances.get(position); + final ViewHolder holder = (ViewHolder) viewHolder; + + holder.description.setText(instance.getShortDescription()); + holder.name.setText(instance.getName()); + holder.host.setText(instance.getHost()); + + StringBuilder categories = new StringBuilder(); + if (instance.getCategories() != null && instance.getCategories().size() > 0) { + Iterator> it = instance.getCategories().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + LinkedHashMap info_cat = peertubeInformation.getCategories(); + categories.append(info_cat.get(pair.getKey())).append(" "); + it.remove(); + } + } + holder.tags.setText(categories); + + StringBuilder languages = new StringBuilder(); + if (instance.getLanguages() != null && instance.getLanguages().size() > 0) { + Iterator> it = instance.getLanguages().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + languages.append(pair.getKey()).append(" "); + it.remove(); + } + } + holder.languages.setText(languages); + holder.sensitive_content.setText(context.getString(R.string.sensitive_content, instance.getDefaultNSFWPolicy())); + holder.followers_instance.setText(context.getString(R.string.followers_instance, String.valueOf(instance.getTotalInstanceFollowers()))); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return instances.size(); + } + + + static class ViewHolder extends RecyclerView.ViewHolder { + + Button pickup; + TextView name, host, description; + TextView tags, followers_instance, languages, sensitive_content; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + pickup = itemView.findViewById(R.id.pickup); + name = itemView.findViewById(R.id.name); + host = itemView.findViewById(R.id.host); + description = itemView.findViewById(R.id.description); + tags = itemView.findViewById(R.id.tags); + languages = itemView.findViewById(R.id.languages); + sensitive_content = itemView.findViewById(R.id.sensitive_content); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/fedilabtube/viewmodel/InstancesVM.java b/app/src/main/java/app/fedilab/fedilabtube/viewmodel/InstancesVM.java new file mode 100644 index 0000000..5719e75 --- /dev/null +++ b/app/src/main/java/app/fedilab/fedilabtube/viewmodel/InstancesVM.java @@ -0,0 +1,59 @@ +package app.fedilab.fedilabtube.viewmodel; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of TubeLab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with TubeLab; if not, + * see . */ + +import android.app.Application; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import app.fedilab.fedilabtube.client.APIResponse; +import app.fedilab.fedilabtube.client.PeertubeAPI; +import app.fedilab.fedilabtube.client.entities.InstanceParams; + + +public class InstancesVM extends AndroidViewModel { + private MutableLiveData apiResponseMutableLiveData; + + public InstancesVM(@NonNull Application application) { + super(application); + } + + public LiveData getInstances(InstanceParams instanceParams) { + apiResponseMutableLiveData = new MutableLiveData<>(); + get(instanceParams); + return apiResponseMutableLiveData; + } + + private void get(InstanceParams instanceParams) { + Context _mContext = getApplication().getApplicationContext(); + new Thread(() -> { + try { + APIResponse apiResponse = new PeertubeAPI(_mContext).getInstances(instanceParams); + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> apiResponseMutableLiveData.setValue(apiResponse); + mainHandler.post(myRunnable); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + } + +} diff --git a/app/src/main/res/drawable/ic_baseline_forum_24.xml b/app/src/main/res/drawable/ic_baseline_forum_24.xml new file mode 100644 index 0000000..2f776eb --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_forum_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_group_24.xml b/app/src/main/res/drawable/ic_baseline_group_24.xml new file mode 100644 index 0000000..71da7d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_group_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_instance_picker.xml b/app/src/main/res/layout/activity_instance_picker.xml new file mode 100644 index 0000000..f4395a2 --- /dev/null +++ b/app/src/main/res/layout/activity_instance_picker.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_playlists.xml b/app/src/main/res/layout/activity_playlists.xml index 6773179..8805665 100644 --- a/app/src/main/res/layout/activity_playlists.xml +++ b/app/src/main/res/layout/activity_playlists.xml @@ -23,7 +23,7 @@ + tools:context=".PlaylistsActivity"> + + + + + + + + + + + + + + + + + + +