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 000000000..a65e4ee8f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/mastodon_icon_item.png differ 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 000000000..d65ff271b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/peertube_icon.png differ 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 000000000..3959d5a7f Binary files /dev/null and b/app/src/main/res/drawable-ldpi/mastodon_icon_item.png differ 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 000000000..fca1dc91b Binary files /dev/null and b/app/src/main/res/drawable-ldpi/peertube_icon.png differ diff --git a/app/src/main/res/drawable-mdpi/mastodon_icon_item.png b/app/src/main/res/drawable-mdpi/mastodon_icon_item.png new file mode 100644 index 000000000..34bea8337 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/mastodon_icon_item.png differ diff --git a/app/src/main/res/drawable-mdpi/peertube_icon.png b/app/src/main/res/drawable-mdpi/peertube_icon.png new file mode 100644 index 000000000..2c5df945a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/peertube_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/mastodon_icon_item.png b/app/src/main/res/drawable-xhdpi/mastodon_icon_item.png new file mode 100644 index 000000000..bd01edc13 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/mastodon_icon_item.png differ diff --git a/app/src/main/res/drawable-xhdpi/peertube_icon.png b/app/src/main/res/drawable-xhdpi/peertube_icon.png new file mode 100644 index 000000000..fd4d5b772 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/peertube_icon.png differ 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 000000000..33b0ee6b3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/mastodon_icon_item.png differ diff --git a/app/src/main/res/drawable-xxhdpi/peertube_icon.png b/app/src/main/res/drawable-xxhdpi/peertube_icon.png new file mode 100644 index 000000000..931d894b9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/peertube_icon.png differ 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 000000000..257515de1 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/mastodon_icon_item.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/peertube_icon.png b/app/src/main/res/drawable-xxxhdpi/peertube_icon.png new file mode 100644 index 000000000..1ee562168 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/peertube_icon.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f786d3321..4dac1d1dc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,6 +74,12 @@ android:layout_height="wrap_content" app:tabSelectedTextColor="?attr/colorAccent" /> + + + + 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