From 9f9b9c1186ad18af9887eddfd0f4fee3faadef55 Mon Sep 17 00:00:00 2001 From: stom79 Date: Wed, 17 Oct 2018 18:20:03 +0200 Subject: [PATCH] Change remote instances --- .../mastodon/activities/BaseMainActivity.java | 288 +++++++++++++++++- .../mastodon/drawers/PeertubeAdapter.java | 17 +- .../res/drawable-anydpi/ic_add_instance.xml | 9 + .../drawable-anydpi/ic_delete_instance.xml | 9 + .../res/drawable-hdpi/mastodon_icon_item.png | Bin 0 -> 1587 bytes .../main/res/drawable-hdpi/peertube_icon.png | Bin 0 -> 722 bytes .../res/drawable-ldpi/mastodon_icon_item.png | Bin 0 -> 679 bytes .../main/res/drawable-ldpi/peertube_icon.png | Bin 0 -> 374 bytes .../res/drawable-mdpi/mastodon_icon_item.png | Bin 0 -> 949 bytes .../main/res/drawable-mdpi/peertube_icon.png | Bin 0 -> 488 bytes .../res/drawable-xhdpi/mastodon_icon_item.png | Bin 0 -> 1856 bytes .../main/res/drawable-xhdpi/peertube_icon.png | Bin 0 -> 1011 bytes .../drawable-xxhdpi/mastodon_icon_item.png | Bin 0 -> 3212 bytes .../res/drawable-xxhdpi/peertube_icon.png | Bin 0 -> 1395 bytes .../drawable-xxxhdpi/mastodon_icon_item.png | Bin 0 -> 3728 bytes .../res/drawable-xxxhdpi/peertube_icon.png | Bin 0 -> 2058 bytes app/src/main/res/layout/activity_main.xml | 6 + app/src/main/res/layout/drawer_peertube.xml | 2 +- app/src/main/res/menu/remote_instances.xml | 9 + app/src/main/res/values/strings.xml | 1 + 20 files changed, 334 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable-anydpi/ic_add_instance.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_delete_instance.xml create mode 100644 app/src/main/res/drawable-hdpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-hdpi/peertube_icon.png create mode 100644 app/src/main/res/drawable-ldpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-ldpi/peertube_icon.png create mode 100644 app/src/main/res/drawable-mdpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-mdpi/peertube_icon.png create mode 100644 app/src/main/res/drawable-xhdpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-xhdpi/peertube_icon.png create mode 100644 app/src/main/res/drawable-xxhdpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-xxhdpi/peertube_icon.png create mode 100644 app/src/main/res/drawable-xxxhdpi/mastodon_icon_item.png create mode 100644 app/src/main/res/drawable-xxxhdpi/peertube_icon.png create mode 100644 app/src/main/res/menu/remote_instances.xml diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java index e5a704839..b992a181e 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java @@ -46,7 +46,10 @@ import android.support.v7.widget.PopupMenu; import android.support.v7.widget.SearchView; import android.support.v7.widget.SwitchCompat; import android.text.Editable; +import android.text.Html; +import android.text.InputFilter; import android.text.TextWatcher; +import android.util.Log; import android.util.Patterns; import android.view.Gravity; import android.view.LayoutInflater; @@ -61,7 +64,12 @@ import android.view.MenuItem; import android.view.ViewGroup; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.CheckBox; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; @@ -71,6 +79,7 @@ import android.widget.Toast; import java.io.File; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -85,13 +94,16 @@ import fr.gouv.etalab.mastodon.asynctasks.RetrieveInstanceAsyncTask; import fr.gouv.etalab.mastodon.asynctasks.RetrieveMetaDataAsyncTask; import fr.gouv.etalab.mastodon.asynctasks.RetrieveRemoteDataAsyncTask; import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoByIDAsyncTask; +import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Filters; import fr.gouv.etalab.mastodon.client.Entities.Notification; +import fr.gouv.etalab.mastodon.client.Entities.RemoteInstance; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.client.Entities.Version; +import fr.gouv.etalab.mastodon.client.HttpsConnection; import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayBookmarksFragment; import fr.gouv.etalab.mastodon.fragments.DisplayDraftsFragment; @@ -114,6 +126,7 @@ import fr.gouv.etalab.mastodon.interfaces.OnRetrieveRemoteAccountInterface; import fr.gouv.etalab.mastodon.interfaces.OnUpdateAccountInfoInterface; import fr.gouv.etalab.mastodon.services.BackupStatusService; import fr.gouv.etalab.mastodon.services.LiveNotificationService; +import fr.gouv.etalab.mastodon.sqlite.InstancesDAO; import fr.gouv.etalab.mastodon.sqlite.SearchDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; import fr.gouv.etalab.mastodon.asynctasks.RetrieveAccountsAsyncTask; @@ -143,6 +156,11 @@ import static fr.gouv.etalab.mastodon.helper.Helper.unCheckAllMenuItems; import static fr.gouv.etalab.mastodon.helper.Helper.updateHeaderAccountInfo; import android.support.v4.app.FragmentStatePagerAdapter; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.w3c.dom.Text; + public abstract class BaseMainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface { @@ -176,6 +194,9 @@ public abstract class BaseMainActivity extends BaseActivity private String instance; public int countPage; private PagerAdapter adapter; + private String oldSearch; + boolean isLoadingInstance = false; + private ImageView delete_instance; @Override protected void onCreate(Bundle savedInstanceState) { @@ -227,6 +248,7 @@ public abstract class BaseMainActivity extends BaseActivity toolbarTitle = toolbar.findViewById(R.id.toolbar_title); toolbar_search = toolbar.findViewById(R.id.toolbar_search); tabLayout = findViewById(R.id.tabLayout); + delete_instance = findViewById(R.id.delete_instance); TabLayout.Tab tabHome = tabLayout.newTab(); TabLayout.Tab tabNotif = tabLayout.newTab(); TabLayout.Tab tabDirect = tabLayout.newTab(); @@ -273,6 +295,35 @@ public abstract class BaseMainActivity extends BaseActivity FloatingActionButton federatedTimelines = findViewById(R.id.federated_timeline); + delete_instance.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try{ + String title = toolbarTitle.getText().toString(); + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BaseMainActivity.this); + dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + new InstancesDAO(BaseMainActivity.this, db).remove(title); + BaseMainActivity.this.onBackPressed(); + } + }); + dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }); + dialogBuilder.setTitle(R.string.delete_instance); + dialogBuilder.setMessage(getString(R.string.warning_delete_instance, title)); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + + }catch (Exception e){ + Toast.makeText(BaseMainActivity.this, R.string.toast_error, Toast.LENGTH_SHORT).show(); + } + } + }); boolean displayFollowInstance = sharedpreferences.getBoolean(Helper.SET_DISPLAY_FOLLOW_INSTANCE, true); if( !displayFollowInstance) @@ -280,8 +331,227 @@ public abstract class BaseMainActivity extends BaseActivity federatedTimelines.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getApplicationContext(), InstanceFederatedActivity.class); - startActivity(intent); + /*Intent intent = new Intent(getApplicationContext(), InstanceFederatedActivity.class); + startActivity(intent);*/ + SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + new InstancesDAO(BaseMainActivity.this, db).cleanDoublon(); + List remoteInstances = new InstancesDAO(BaseMainActivity.this, db).getAllInstances(); + PopupMenu popup = new PopupMenu(BaseMainActivity.this, federatedTimelines); + popup.getMenuInflater() + .inflate(R.menu.remote_instances, popup.getMenu()); + try { + @SuppressLint("PrivateApi") Method method = popup.getMenu().getClass().getDeclaredMethod("setOptionalIconsVisible", boolean.class); + method.setAccessible(true); + method.invoke(popup.getMenu(), true); + } catch (Exception e) { + e.printStackTrace(); + } + int i = 0; + for(RemoteInstance remoteInstance: remoteInstances) { + MenuItem item = popup.getMenu().add(0, i, Menu.NONE, remoteInstance.getHost()); + if(remoteInstance.getType() == null || remoteInstance.getType().equals("MASTODON")) + item.setIcon(R.drawable.mastodon_icon_item); + else + item.setIcon(R.drawable.peertube_icon); + i++; + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + DisplayStatusFragment statusFragment; + Bundle bundle = new Bundle(); + statusFragment = new DisplayStatusFragment(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE); + bundle.putString("remote_instance", remoteInstance.getHost()); + statusFragment.setArguments(bundle); + String fragmentTag = "REMOTE_INSTANCE"; + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); + main_app_container.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.GONE); + tabLayout.setVisibility(View.GONE); + toolbarTitle.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.VISIBLE); + toolbarTitle.setText(remoteInstance.getHost()); + return false; + } + }); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_add_instance: + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BaseMainActivity.this); + LayoutInflater inflater = getLayoutInflater(); + @SuppressLint("InflateParams") View dialogView = inflater.inflate(R.layout.search_instance, null); + dialogBuilder.setView(dialogView); + + AutoCompleteTextView instance_list = dialogView.findViewById(R.id.search_instance); + CheckBox peertube_instance = dialogView.findViewById(R.id.peertube_instance); + instance_list.setFilters(new InputFilter[]{new InputFilter.LengthFilter(60)}); + dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + String instanceName = instance_list.getText().toString().trim(); + new Thread(new Runnable(){ + @Override + public void run() { + try { + if( !peertube_instance.isChecked()) + new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/timelines/public?local=true", 10, null, null); + else + new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/videos/", 10, null, null); + runOnUiThread(new Runnable() { + public void run() { + JSONObject resobj; + dialog.dismiss(); + if( peertube_instance.isChecked()) + new InstancesDAO(BaseMainActivity.this, db).insertInstance(instanceName, "PEERTUBE"); + else + new InstancesDAO(BaseMainActivity.this, db).insertInstance(instanceName, "MASTODON"); + DisplayStatusFragment statusFragment; + Bundle bundle = new Bundle(); + statusFragment = new DisplayStatusFragment(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE); + bundle.putString("remote_instance", instanceName); + statusFragment.setArguments(bundle); + String fragmentTag = "REMOTE_INSTANCE"; + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); + main_app_container.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.GONE); + delete_instance.setVisibility(View.VISIBLE); + tabLayout.setVisibility(View.GONE); + toolbarTitle.setVisibility(View.VISIBLE); + toolbarTitle.setText(instanceName); + } + }); + } catch (final Exception e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + public void run() { + Toast.makeText(getApplicationContext(), R.string.toast_instance_unavailable,Toast.LENGTH_LONG).show(); + } + }); + } + } + }).start(); + } + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialogInterface) { + //Hide keyboard + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + assert imm != null; + imm.hideSoftInputFromWindow(instance_list.getWindowToken(), 0); + } + }); + if( alertDialog.getWindow() != null ) + alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + alertDialog.show(); + + instance_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick (AdapterView parent, View view, int position, long id) { + oldSearch = parent.getItemAtPosition(position).toString().trim(); + } + }); + instance_list.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + Pattern host = Pattern.compile("([\\da-z\\.-]+\\.[a-z\\.]{2,12})"); + Matcher matcher = host.matcher(s.toString().trim()); + if( s.toString().trim().length() == 0 || !matcher.find()) { + alertDialog.getButton( + AlertDialog.BUTTON_POSITIVE).setEnabled(false); + } else { + // Something into edit text. Enable the button. + alertDialog.getButton( + AlertDialog.BUTTON_POSITIVE).setEnabled(true); + } + if (s.length() > 2 && !isLoadingInstance) { + final String action = "/instances/search"; + final HashMap parameters = new HashMap<>(); + parameters.put("q", s.toString().trim()); + parameters.put("count", String.valueOf(1000)); + parameters.put("name", String.valueOf(true)); + isLoadingInstance = true; + + if( oldSearch == null || !oldSearch.equals(s.toString().trim())) + new Thread(new Runnable() { + @Override + public void run() { + try { + final String response = new HttpsConnection(BaseMainActivity.this).get("https://instances.social/api/1.0" + action, 30, parameters, Helper.THEKINRAR_SECRET_TOKEN); + runOnUiThread(new Runnable() { + public void run() { + isLoadingInstance = false; + String[] instances; + try { + JSONObject jsonObject = new JSONObject(response); + JSONArray jsonArray = jsonObject.getJSONArray("instances"); + if (jsonArray != null) { + int length = 0; + for (int i = 0; i < jsonArray.length(); i++) { + if( !jsonArray.getJSONObject(i).get("name").toString().contains("@") && jsonArray.getJSONObject(i).get("up").toString().equals("true")) + length++; + } + instances = new String[length]; + int j = 0; + for (int i = 0; i < jsonArray.length(); i++) { + if( !jsonArray.getJSONObject(i).get("name").toString().contains("@") && jsonArray.getJSONObject(i).get("up").toString().equals("true")) { + instances[j] = jsonArray.getJSONObject(i).get("name").toString(); + j++; + } + } + } else { + instances = new String[]{}; + } + instance_list.setAdapter(null); + ArrayAdapter adapter = + new ArrayAdapter<>(BaseMainActivity.this, android.R.layout.simple_list_item_1, instances); + instance_list.setAdapter(adapter); + if (instance_list.hasFocus() && !BaseMainActivity.this.isFinishing()) + instance_list.showDropDown(); + oldSearch = s.toString().trim(); + + } catch (JSONException ignored) { + isLoadingInstance = false; + } + } + }); + + } catch (HttpsConnection.HttpsConnectionException e) { + isLoadingInstance = false; + } catch (Exception e) { + isLoadingInstance = false; + } + } + }).start(); + else + isLoadingInstance = false; + } + } + }); + break; + } + return true; + } + }); + popup.show(); } }); @@ -449,6 +719,7 @@ public abstract class BaseMainActivity extends BaseActivity } main_app_container.setVisibility(View.GONE); viewPager.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.GONE); Helper.switchLayout(BaseMainActivity.this); if( tab.getPosition() != 1 ) toot.show(); @@ -480,6 +751,7 @@ public abstract class BaseMainActivity extends BaseActivity public void onTabReselected(TabLayout.Tab tab) { if( viewPager.getVisibility() == View.GONE){ viewPager.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.GONE); Helper.switchLayout(BaseMainActivity.this); main_app_container.setVisibility(View.GONE); DrawerLayout drawer = findViewById(R.id.drawer_layout); @@ -605,12 +877,14 @@ public abstract class BaseMainActivity extends BaseActivity if( main_app_container.getVisibility() == View.VISIBLE){ main_app_container.setVisibility(View.VISIBLE); viewPager.setVisibility(View.GONE); + delete_instance.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); toolbarTitle.setVisibility(View.VISIBLE); }else { main_app_container.setVisibility(View.GONE); viewPager.setVisibility(View.VISIBLE); tabLayout.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.GONE); toolbarTitle.setVisibility(View.GONE); } return false; @@ -637,6 +911,7 @@ public abstract class BaseMainActivity extends BaseActivity tabLayout.setVisibility(View.VISIBLE); toolbarTitle.setVisibility(View.GONE); } + delete_instance.setVisibility(View.GONE); //your code here return false; } @@ -660,6 +935,7 @@ public abstract class BaseMainActivity extends BaseActivity toolbarTitle.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); } + delete_instance.setVisibility(View.GONE); } }); @@ -911,6 +1187,7 @@ public abstract class BaseMainActivity extends BaseActivity tabLayout.setVisibility(View.VISIBLE); toolbarTitle.setVisibility(View.GONE); } + delete_instance.setVisibility(View.GONE); } }); @@ -1011,6 +1288,7 @@ public abstract class BaseMainActivity extends BaseActivity viewPager.setVisibility(View.VISIBLE); tabLayout.setVisibility(View.VISIBLE); toolbarTitle.setVisibility(View.GONE); + delete_instance.setVisibility(View.GONE); } } @@ -1347,12 +1625,14 @@ public abstract class BaseMainActivity extends BaseActivity }else { super.onBackPressed(); } - }else { + } else { Helper.switchLayout(BaseMainActivity.this); main_app_container.setVisibility(View.GONE); + viewPager.setVisibility(View.VISIBLE); tabLayout.setVisibility(View.VISIBLE); toolbarTitle.setVisibility(View.GONE); + delete_instance.setVisibility(View.GONE); delete_all.hide(); add_new.hide(); final NavigationView navigationView = findViewById(R.id.nav_view); @@ -1490,9 +1770,11 @@ public abstract class BaseMainActivity extends BaseActivity String fragmentTag = null; main_app_container.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); toolbarTitle.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.GONE); appBar.setExpanded(true); if (id != R.id.nav_drafts && id != R.id.nav_bookmarks ) { delete_all.hide(); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java index 69b05ba56..8505771b5 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java @@ -17,6 +17,7 @@ package fr.gouv.etalab.mastodon.drawers; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; @@ -77,6 +78,15 @@ public class PeertubeAdapter extends RecyclerView.Adapter implements OnListActio final PeertubeAdapter.ViewHolder holder = (PeertubeAdapter.ViewHolder) viewHolder; final Peertube peertube = peertubes.get(position); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + if( theme == Helper.THEME_LIGHT){ + holder.main_container.setBackgroundResource(R.color.mastodonC3__); + }else if (theme == Helper.THEME_DARK){ + holder.main_container.setBackgroundResource(R.color.mastodonC1_); + }else if (theme == Helper.THEME_BLACK){ + holder.main_container.setBackgroundResource(R.color.black); + } Account account = peertube.getAccount(); @@ -96,7 +106,7 @@ public class PeertubeAdapter extends RecyclerView.Adapter implements OnListActio .load("https://" + peertube.getInstance() + peertube.getThumbnailPath()) .into(holder.peertube_video_image); Helper.loadGiF(context, account.getAvatar(), holder.peertube_profile); - holder.how_to_container.setOnClickListener(new View.OnClickListener() { + holder.main_container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, PeertubeActivity.class); @@ -134,20 +144,21 @@ public class PeertubeAdapter extends RecyclerView.Adapter implements OnListActio } class ViewHolder extends RecyclerView.ViewHolder{ - LinearLayout how_to_container; + LinearLayout main_container; ImageView peertube_profile, peertube_video_image; TextView peertube_account_name, peertube_views, peertube_duration; TextView peertube_title, peertube_date; + public ViewHolder(@NonNull View itemView) { super(itemView); peertube_account_name = itemView.findViewById(R.id.peertube_account_name); peertube_title = itemView.findViewById(R.id.peertube_title); peertube_video_image = itemView.findViewById(R.id.peertube_video_image); peertube_profile = itemView.findViewById(R.id.peertube_profile); - how_to_container = itemView.findViewById(R.id.how_to_container); peertube_date = itemView.findViewById(R.id.peertube_date); peertube_views = itemView.findViewById(R.id.peertube_views); peertube_duration = itemView.findViewById(R.id.peertube_duration); + main_container = itemView.findViewById(R.id.main_container); } } diff --git a/app/src/main/res/drawable-anydpi/ic_add_instance.xml b/app/src/main/res/drawable-anydpi/ic_add_instance.xml new file mode 100644 index 000000000..f88ddb1d5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_add_instance.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_delete_instance.xml b/app/src/main/res/drawable-anydpi/ic_delete_instance.xml new file mode 100644 index 000000000..688d346a3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_delete_instance.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-hdpi/mastodon_icon_item.png b/app/src/main/res/drawable-hdpi/mastodon_icon_item.png new file mode 100644 index 0000000000000000000000000000000000000000..a65e4ee8fc200b13e6ce52416a114bd27f49504b GIT binary patch literal 1587 zcmV-32F&@1P)a(7cI?sA^}Qil>x@upTO0%?LGUOE1Y~U* zJQ+92@2RbETIYx`MsH|E6fKclUkSBZ}5MyIG#L}v^d8FEU3rNzg5e}ED&1kibL(iVDqYaIAv?4@ zY*Eqt6>1LcZuX%-IEnCxB}aKAQwVuO3A7W)J^~UC%<)5kd^MUFMHjk)=v-$I-Sm#2NPHA={V}j4hK6B&!y7?o zJBN^|JH(&G!!Z~~PZ_P_?t^Fr3=njkWkj?FfAO0PfIILt%il5d!YK!O65O%zq#d<5 z!n_3-E%sslEZ%z&&fE?N$_+(R=;hPS@c!yJjRUp1BIp`mm&wbAE_IKBDgwK3D=66Nj_`M12g@@=de<=B;QtheESGUV5gQs7 z{5&Kl##+PFYCdfRhcno6@t)`f+zr@LUo|i$n=~05KVUvKL=y% z^((47cM-3hli;Y^P8;0eDVht1Q?Q;A`-|8Nr$X2xaa~hc63~@Fajr|YyZIAov8;%1 zdaF)_WaW*6{X#xv_YzBr(%8BnG|jZuKEyTz?m`C+gHpq^zGnmw!Tx6qo-l*=jQ$|p zu`@d7FUli-8f1H$pLt+$SwW_|E<4^|0NwQl7EET`hx>>-$QXSeDy!PpFRyCfN*=xQ zzVdKKxcruvAoiXB1xV?D#*b0^sav4(X(8raoCiHJ#Q~N*tVLf`Ae>> zzFsQZ-})$Zw6j!M-Jv88wLK14J9DxU#lqzWukVKk?}fZdii9{9n0n6;rM5WXOtgix62&l*axCWPX6rIyi9MLSm)^ESoRi)4Ul3Tw#y(1t6mC!aNGmm%!~_2wg~S zjXef$7@>7NVaS!BvbwzsTsU*0%zvJ)FQ3);OIfXJ8@$~q(72seaRb8NDmM!AL8vJ0 luzpghbw0=FI}7h8^B-gGpb)_YsMY`g002ovPDHLkV1iS1>@olV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/peertube_icon.png b/app/src/main/res/drawable-hdpi/peertube_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d65ff271b3d45ffa581f27a366cddfc6c232ec40 GIT binary patch literal 722 zcmV;@0xkWCP)ELrVJ=WoQaA41xNv9PXl$r$qrAdHh$#;-Wzn@;jXRs#7$1)SqU&ydzD%%wSF9;%Owx>wdf%iT@2pHl09phij8Qu z76c3DgRHK>L@|?ILo{I(D7hA;kG?!4HgAIEr*6yUo;7TEk=xPEYF)Ul6?i-BSCEpA zLr_6V`tg|hUR(i7Bi`a65miLNnin|Equ5}Ro#x#zwG?RWiDF5OkNTsf*wr=2=5=uacjg$)RNw2=3#J00q-TlM-50_6dx$Zx ztbV{n?`M`yr;lQ>*js4T$uiT!eS+Fy%~OK*zCmV7Fa%Tgstkm6*=&WwVF%kg;-O#? zEbbmGu3NDo2x7b+3bZ79z1}T`VeI{`)F@`RFX|us4_ir^z}Z&FSO5S307*qoM6N<$ Eg5bkXV*mgE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/mastodon_icon_item.png b/app/src/main/res/drawable-ldpi/mastodon_icon_item.png new file mode 100644 index 0000000000000000000000000000000000000000..3959d5a7fb8d3bf355d06acf2830348d22ec0a93 GIT binary patch literal 679 zcmV;Y0$BZtP)bjY^0_qrnFYF{Pbv`cOcPJEK2AqlvmOBre>za|J<71s~YX^i5!4j8KTO zF)RQP!>SM!ifGz-ly>?C(iQ@JbMa2mjo#$W$$gwT-<)qK3gf&dQ*Ur3?h{s;q**>f zTY^PIz%0;KUS@346yuCPpa-H2%06Y{grj;-a-8W;XJ}3;8EiroNuad^fVKvqR%4&> zB(sbwI&HEA8Y#vR?!-p!k~;)Xrc>aaTZgWxBwQVopc7H4pMFlkWsd~Jo!DgTkzR`C zgfPtt)yGIkY?fh8-h$v-5oTAmAh241`RF#pH_Bk1NrR3Rb_gr1Qh4Sa1INSL?-^K5 z72wK%1oz&{Ag&i{sMJ1r8-^CMV8T5-@-C%3j94hmNnsP(96a3gMnKM$;TB@MLjbQo z3nNQeIA{M$VuN6`@i2^oi9e+4Lt*%pF2D`McBfFAjs8$b0uU>oSCk4SB)vnW34V`s z!O26%m<$&YTTy8kXI@llbx2jh2_i*UKFV->_0EV49Ur2=pt5519tJ>&V%+f@#b6zV>OK`}=XZp87A4NbI3&#J2K=aH5Dtl+d6&UPn;xj5+^Z{|!%zu%#|8-5US^ N002ovPDHLkV1g_PJRSf5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/peertube_icon.png b/app/src/main/res/drawable-ldpi/peertube_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fca1dc91b02fda499e64098d31acf52be3c0289f GIT binary patch literal 374 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/mastodon_icon_item.png b/app/src/main/res/drawable-xxhdpi/mastodon_icon_item.png new file mode 100644 index 0000000000000000000000000000000000000000..33b0ee6b337b8a844ef8a4fb5818289bcbcc7022 GIT binary patch literal 3212 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 Bie3N! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/mastodon_icon_item.png b/app/src/main/res/drawable-xxxhdpi/mastodon_icon_item.png new file mode 100644 index 0000000000000000000000000000000000000000..257515de110a0b93e5fad2e6042002793987cde4 GIT binary patch literal 3728 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 o!}yON9UIWPP}||?sBLuq2TB$`Rde + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f610a47c0..c2b71f4a1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -639,6 +639,7 @@ Be the first to leave a comment on this video with the top right button! %s views Duration: %s + Add an instance Never