mirror of
				https://framagit.org/tom79/fedilab-tube
				synced 2025-06-05 21:09:11 +02:00 
			
		
		
		
	Display account
This commit is contained in:
		| @@ -38,7 +38,6 @@ allprojects { | |||||||
| } | } | ||||||
|  |  | ||||||
| dependencies { | dependencies { | ||||||
|  |  | ||||||
|     implementation "androidx.multidex:multidex:2.0.1" |     implementation "androidx.multidex:multidex:2.0.1" | ||||||
|     implementation fileTree(dir: "libs", include: ["*.jar"]) |     implementation fileTree(dir: "libs", include: ["*.jar"]) | ||||||
|     implementation 'androidx.appcompat:appcompat:1.1.0' |     implementation 'androidx.appcompat:appcompat:1.1.0' | ||||||
|   | |||||||
| @@ -46,6 +46,14 @@ | |||||||
|             android:configChanges="orientation|screenSize" |             android:configChanges="orientation|screenSize" | ||||||
|             android:label="@string/app_name" |             android:label="@string/app_name" | ||||||
|             android:windowSoftInputMode="stateAlwaysHidden" /> |             android:windowSoftInputMode="stateAlwaysHidden" /> | ||||||
|  |  | ||||||
|  |         <activity | ||||||
|  |             android:name=".ShowAccountActivity" | ||||||
|  |             android:configChanges="orientation|screenSize" | ||||||
|  |             android:label="@string/app_name" | ||||||
|  |             android:theme="@style/AppThemeNoActionBar" | ||||||
|  |             android:windowSoftInputMode="stateAlwaysHidden" /> | ||||||
|  |  | ||||||
|         <receiver |         <receiver | ||||||
|             android:name=".services.PeertubeUploadReceiver" |             android:name=".services.PeertubeUploadReceiver" | ||||||
|             android:exported="false"> |             android:exported="false"> | ||||||
|   | |||||||
| @@ -0,0 +1,489 @@ | |||||||
|  | package app.fedilab.fedilabtube; | ||||||
|  |  | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.content.SharedPreferences; | ||||||
|  | import android.content.res.ColorStateList; | ||||||
|  | import android.database.sqlite.SQLiteDatabase; | ||||||
|  | import android.os.AsyncTask; | ||||||
|  | import android.os.Build; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.text.Html; | ||||||
|  | import android.text.SpannableString; | ||||||
|  | import android.text.method.LinkMovementMethod; | ||||||
|  | import android.view.View; | ||||||
|  | import android.widget.ImageButton; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | import android.widget.LinearLayout; | ||||||
|  | import android.widget.TextView; | ||||||
|  | import android.widget.Toast; | ||||||
|  |  | ||||||
|  | import androidx.appcompat.app.AlertDialog; | ||||||
|  | import androidx.appcompat.app.AppCompatActivity; | ||||||
|  | import androidx.core.content.ContextCompat; | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | import androidx.fragment.app.FragmentManager; | ||||||
|  | import androidx.fragment.app.FragmentStatePagerAdapter; | ||||||
|  | import androidx.viewpager.widget.PagerAdapter; | ||||||
|  | import androidx.viewpager.widget.ViewPager; | ||||||
|  |  | ||||||
|  | import com.bumptech.glide.Glide; | ||||||
|  | import com.google.android.material.appbar.AppBarLayout; | ||||||
|  | import com.google.android.material.tabs.TabLayout; | ||||||
|  |  | ||||||
|  | import org.jetbrains.annotations.NotNull; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.asynctasks.PostActionAsyncTask; | ||||||
|  | import app.fedilab.fedilabtube.asynctasks.RetrieveFeedsAsyncTask; | ||||||
|  | import app.fedilab.fedilabtube.asynctasks.RetrieveRelationshipAsyncTask; | ||||||
|  | import app.fedilab.fedilabtube.client.APIResponse; | ||||||
|  | import app.fedilab.fedilabtube.client.PeertubeAPI; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.InstanceNodeInfo; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Relationship; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Status; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.StatusDrawerParams; | ||||||
|  | import app.fedilab.fedilabtube.drawer.StatusListAdapter; | ||||||
|  | import app.fedilab.fedilabtube.fragment.DisplayAccountsFragment; | ||||||
|  | import app.fedilab.fedilabtube.fragment.DisplayStatusFragment; | ||||||
|  | import app.fedilab.fedilabtube.helper.Helper; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnPostActionInterface; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsAccountInterface; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveFeedsInterface; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface; | ||||||
|  | import app.fedilab.fedilabtube.sqlite.AccountDAO; | ||||||
|  | import app.fedilab.fedilabtube.sqlite.Sqlite; | ||||||
|  | import es.dmoral.toasty.Toasty; | ||||||
|  |  | ||||||
|  | import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY; | ||||||
|  | import static app.fedilab.fedilabtube.helper.Helper.getLiveInstance; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class ShowAccountActivity extends AppCompatActivity implements OnPostActionInterface, OnRetrieveFeedsAccountInterface, OnRetrieveRelationshipInterface, OnRetrieveFeedsInterface { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private List<Status> statuses; | ||||||
|  |     private StatusListAdapter statusListAdapter; | ||||||
|  |     private ImageButton account_follow; | ||||||
|  |     private ViewPager mPager; | ||||||
|  |     private TabLayout tabLayout; | ||||||
|  |     private TextView account_note; | ||||||
|  |     private String userId; | ||||||
|  |     private Relationship relationship; | ||||||
|  |     private ImageButton header_edit_profile; | ||||||
|  |     private List<Status> pins; | ||||||
|  |     private int maxScrollSize; | ||||||
|  |     private boolean avatarShown = true; | ||||||
|  |     private ImageView account_pp; | ||||||
|  |     private TextView account_dn; | ||||||
|  |     private TextView account_un; | ||||||
|  |     private Account account; | ||||||
|  |     private String accountId; | ||||||
|  |     private boolean ischannel; | ||||||
|  |     private AsyncTask<Void, Void, Void> retrieveRelationship; | ||||||
|  |     private action doAction; | ||||||
|  |     private PeertubeAPI.StatusAction doActionAccount; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onCreate(Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |         SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); | ||||||
|  |         setContentView(R.layout.activity_show_account); | ||||||
|  |         setTitle(""); | ||||||
|  |         pins = new ArrayList<>(); | ||||||
|  |         Bundle b = getIntent().getExtras(); | ||||||
|  |         account_follow = findViewById(R.id.account_follow); | ||||||
|  |         header_edit_profile = findViewById(R.id.header_edit_profile); | ||||||
|  |         account_follow.setEnabled(false); | ||||||
|  |         account_pp = findViewById(R.id.account_pp); | ||||||
|  |         account_dn = findViewById(R.id.account_dn); | ||||||
|  |         account_un = findViewById(R.id.account_un); | ||||||
|  |         account_pp.setBackgroundResource(R.drawable.account_pp_border); | ||||||
|  |         if (b != null) { | ||||||
|  |             account = b.getParcelable("account"); | ||||||
|  |             if (account == null) { | ||||||
|  |                 accountId = b.getString("accountId"); | ||||||
|  |             } else { | ||||||
|  |                 accountId = account.getId(); | ||||||
|  |             } | ||||||
|  |             ischannel = b.getBoolean("ischannel", false); | ||||||
|  |             userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); | ||||||
|  |  | ||||||
|  |         } else { | ||||||
|  |             Toasty.error(ShowAccountActivity.this, getString(R.string.toast_error_loading_account), Toast.LENGTH_LONG).show(); | ||||||
|  |         } | ||||||
|  |         statuses = new ArrayList<>(); | ||||||
|  |         StatusDrawerParams statusDrawerParams = new StatusDrawerParams(); | ||||||
|  |         statusDrawerParams.setType(RetrieveFeedsAsyncTask.Type.USER); | ||||||
|  |         statusDrawerParams.setTargetedId(accountId); | ||||||
|  |         statusDrawerParams.setStatuses(statuses); | ||||||
|  |         statusListAdapter = new StatusListAdapter(statusDrawerParams); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         tabLayout = findViewById(R.id.account_tabLayout); | ||||||
|  |         account_note = findViewById(R.id.account_note); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /*header_edit_profile.setOnClickListener(v -> { | ||||||
|  |             Intent intent = new Intent(ShowAccountActivity.this, EditProfileActivity.class); | ||||||
|  |             startActivity(intent); | ||||||
|  |         });*/ | ||||||
|  |  | ||||||
|  |         ImageView action_back = findViewById(R.id.action_back); | ||||||
|  |         action_back.setOnClickListener(v -> finish()); | ||||||
|  |         if (account != null) { | ||||||
|  |             ManageAccount(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void ManageAccount() { | ||||||
|  |         SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); | ||||||
|  |  | ||||||
|  |         String accountIdRelation = account.getAcct(); | ||||||
|  |         retrieveRelationship = new RetrieveRelationshipAsyncTask(ShowAccountActivity.this, accountIdRelation, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |  | ||||||
|  |         String urlHeader = account.getHeader(); | ||||||
|  |         if (urlHeader != null && urlHeader.startsWith("/")) { | ||||||
|  |             urlHeader = "https://"+Helper.getLiveInstance(ShowAccountActivity.this) + account.getHeader(); | ||||||
|  |         } | ||||||
|  |         if (urlHeader != null && !urlHeader.contains("missing.png")) { | ||||||
|  |             ImageView banner_pp = findViewById(R.id.banner_pp); | ||||||
|  |             Glide.with(banner_pp.getContext()) | ||||||
|  |                     .load(urlHeader) | ||||||
|  |                     .into(banner_pp); | ||||||
|  |         } | ||||||
|  |         //Peertube account watched by a Mastodon account | ||||||
|  |         //Bot account | ||||||
|  |  | ||||||
|  |         TextView actionbar_title = findViewById(R.id.show_account_title); | ||||||
|  |         if (account.getAcct() != null) | ||||||
|  |             actionbar_title.setText(account.getAcct()); | ||||||
|  |         ImageView pp_actionBar = findViewById(R.id.pp_actionBar); | ||||||
|  |         if (account.getAvatar() != null) { | ||||||
|  |             Helper.loadGiF(ShowAccountActivity.this, account, pp_actionBar); | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |         final AppBarLayout appBar = findViewById(R.id.appBar); | ||||||
|  |         maxScrollSize = appBar.getTotalScrollRange(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         //Timed muted account | ||||||
|  |         String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); | ||||||
|  |         String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, null); | ||||||
|  |         final SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); | ||||||
|  |         final Account authenticatedAccount = new AccountDAO(ShowAccountActivity.this, db).getUniqAccount(userId, instance); | ||||||
|  |  | ||||||
|  |         appBar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { | ||||||
|  |             LinearLayout toolbarContent = findViewById(R.id.toolbar_content); | ||||||
|  |             if (toolbarContent != null) { | ||||||
|  |                 if (Math.abs(verticalOffset) - appBar.getTotalScrollRange() == 0) { | ||||||
|  |                     if (toolbarContent.getVisibility() == View.GONE) | ||||||
|  |                         toolbarContent.setVisibility(View.VISIBLE); | ||||||
|  |                 } else { | ||||||
|  |                     if (toolbarContent.getVisibility() == View.VISIBLE) | ||||||
|  |                         toolbarContent.setVisibility(View.GONE); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (maxScrollSize == 0) | ||||||
|  |                 maxScrollSize = appBarLayout.getTotalScrollRange(); | ||||||
|  |  | ||||||
|  |             int percentage = (Math.abs(verticalOffset)) * 100 / maxScrollSize; | ||||||
|  |  | ||||||
|  |             if (percentage >= 40 && avatarShown) { | ||||||
|  |                 avatarShown = false; | ||||||
|  |  | ||||||
|  |                 account_pp.animate() | ||||||
|  |                         .scaleY(0).scaleX(0) | ||||||
|  |                         .setDuration(400) | ||||||
|  |                         .start(); | ||||||
|  |             } | ||||||
|  |             if (percentage <= 40 && !avatarShown) { | ||||||
|  |                 avatarShown = true; | ||||||
|  |                 account_pp.animate() | ||||||
|  |                         .scaleY(1).scaleX(1) | ||||||
|  |                         .start(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         mPager = findViewById(R.id.account_viewpager); | ||||||
|  |         if (!ischannel) { | ||||||
|  |             tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.videos))); | ||||||
|  |             tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.channels))); | ||||||
|  |             mPager.setOffscreenPageLimit(2); | ||||||
|  |         } else { | ||||||
|  |             tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.videos))); | ||||||
|  |             mPager.setOffscreenPageLimit(1); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         PagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); | ||||||
|  |         mPager.setAdapter(mPagerAdapter); | ||||||
|  |  | ||||||
|  |         mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { | ||||||
|  |             @Override | ||||||
|  |             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onPageSelected(int position) { | ||||||
|  |                 TabLayout.Tab tab = tabLayout.getTabAt(position); | ||||||
|  |                 if (tab != null) | ||||||
|  |                     tab.select(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onPageScrollStateChanged(int state) { | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { | ||||||
|  |             @Override | ||||||
|  |             public void onTabSelected(TabLayout.Tab tab) { | ||||||
|  |                 mPager.setCurrentItem(tab.getPosition()); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onTabUnselected(TabLayout.Tab tab) { | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onTabReselected(TabLayout.Tab tab) { | ||||||
|  |                 Fragment fragment = null; | ||||||
|  |                 if (mPager.getAdapter() != null) | ||||||
|  |                     fragment = (Fragment) mPager.getAdapter().instantiateItem(mPager, tab.getPosition()); | ||||||
|  |                 switch (tab.getPosition()) { | ||||||
|  |                     case 0: | ||||||
|  |                         if (fragment != null) { | ||||||
|  |                             DisplayStatusFragment displayStatusFragment = ((DisplayStatusFragment) fragment); | ||||||
|  |                             displayStatusFragment.scrollToTop(); | ||||||
|  |                         } | ||||||
|  |                         break; | ||||||
|  |                     case 1: | ||||||
|  |                         if (fragment != null) { | ||||||
|  |                             DisplayAccountsFragment displayAccountsFragment = ((DisplayAccountsFragment) fragment); | ||||||
|  |                             displayAccountsFragment.scrollToTop(); | ||||||
|  |                         } | ||||||
|  |                         break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         account_dn.setText(account.getDisplay_name()); | ||||||
|  |         if (!ischannel || account.getAcct().split("-").length < 4) { | ||||||
|  |             account_un.setText(String.format("@%s", account.getAcct())); | ||||||
|  |         } else { | ||||||
|  |             account_un.setVisibility(View.GONE); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         SpannableString spannableString; | ||||||
|  |  | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) | ||||||
|  |             spannableString = new SpannableString(Html.fromHtml(account.getNote(), FROM_HTML_MODE_LEGACY)); | ||||||
|  |         else | ||||||
|  |             spannableString = new SpannableString(Html.fromHtml(account.getNote())); | ||||||
|  |  | ||||||
|  |         account.setNoteSpan(spannableString); | ||||||
|  |         account_note.setText(account.getNoteSpan(), TextView.BufferType.SPANNABLE); | ||||||
|  |         account_note.setMovementMethod(LinkMovementMethod.getInstance()); | ||||||
|  |         Helper.loadGiF(ShowAccountActivity.this, account, account_pp); | ||||||
|  |         //Follow button | ||||||
|  |         String target = account.getAcct(); | ||||||
|  |         String finalTarget = target; | ||||||
|  |         account_follow.setOnClickListener(v -> { | ||||||
|  |             if (doAction == action.NOTHING) { | ||||||
|  |                 Toasty.info(ShowAccountActivity.this, getString(R.string.nothing_to_do), Toast.LENGTH_LONG).show(); | ||||||
|  |             } else if (doAction == action.FOLLOW) { | ||||||
|  |                 account_follow.setEnabled(false); | ||||||
|  |                 new PostActionAsyncTask(ShowAccountActivity.this, PeertubeAPI.StatusAction.FOLLOW, finalTarget, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |             } else if (doAction == action.UNFOLLOW) { | ||||||
|  |                 boolean confirm_unfollow = sharedpreferences.getBoolean(Helper.SET_UNFOLLOW_VALIDATION, true); | ||||||
|  |                 if (confirm_unfollow) { | ||||||
|  |                     AlertDialog.Builder unfollowConfirm = new AlertDialog.Builder(ShowAccountActivity.this); | ||||||
|  |                     unfollowConfirm.setTitle(getString(R.string.unfollow_confirm)); | ||||||
|  |                     unfollowConfirm.setMessage(account.getAcct()); | ||||||
|  |                     unfollowConfirm.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); | ||||||
|  |                     unfollowConfirm.setPositiveButton(R.string.yes, (dialog, which) -> { | ||||||
|  |                         account_follow.setEnabled(false); | ||||||
|  |                         new PostActionAsyncTask(ShowAccountActivity.this, PeertubeAPI.StatusAction.UNFOLLOW, finalTarget, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |                         dialog.dismiss(); | ||||||
|  |                     }); | ||||||
|  |                     unfollowConfirm.show(); | ||||||
|  |                 } else { | ||||||
|  |                     account_follow.setEnabled(false); | ||||||
|  |                     new PostActionAsyncTask(ShowAccountActivity.this, PeertubeAPI.StatusAction.UNFOLLOW, finalTarget, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         TextView account_date = findViewById(R.id.account_date); | ||||||
|  |         account_date.setText(Helper.shortDateToString(account.getCreated_at())); | ||||||
|  |         account_date.setVisibility(View.VISIBLE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onRetrieveFeedsAccount(List<Status> statuses) { | ||||||
|  |         if (statuses != null) { | ||||||
|  |             this.statuses.addAll(statuses); | ||||||
|  |             statusListAdapter.notifyDataSetChanged(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onRetrieveFeeds(APIResponse apiResponse) { | ||||||
|  |         if (apiResponse.getError() != null) { | ||||||
|  |             Toasty.error(ShowAccountActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onRetrieveRelationship(Relationship relationship, Error error) { | ||||||
|  |  | ||||||
|  |         if (error != null) { | ||||||
|  |             Toasty.error(ShowAccountActivity.this, error.getError(), Toast.LENGTH_LONG).show(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         this.relationship = relationship; | ||||||
|  |         manageButtonVisibility(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         //The authenticated account is followed by the account | ||||||
|  |         if (relationship != null && relationship.isFollowed_by() && !accountId.equals(userId)) { | ||||||
|  |             TextView account_followed_by = findViewById(R.id.account_followed_by); | ||||||
|  |             account_followed_by.setVisibility(View.VISIBLE); | ||||||
|  |         } | ||||||
|  |         invalidateOptionsMenu(); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //Manages the visibility of the button | ||||||
|  |     private void manageButtonVisibility() { | ||||||
|  |         if (relationship == null) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||||
|  |             int[][] states = new int[][]{ | ||||||
|  |                     new int[]{android.R.attr.state_enabled}, // enabled | ||||||
|  |                     new int[]{-android.R.attr.state_enabled}, // disabled | ||||||
|  |                     new int[]{-android.R.attr.state_checked}, // unchecked | ||||||
|  |                     new int[]{android.R.attr.state_pressed}  // pressed | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             int[] colors = new int[]{ | ||||||
|  |                     ContextCompat.getColor(ShowAccountActivity.this, R.color.colorAccent), | ||||||
|  |                     ContextCompat.getColor(ShowAccountActivity.this, R.color.colorAccent), | ||||||
|  |                     ContextCompat.getColor(ShowAccountActivity.this, R.color.colorAccent), | ||||||
|  |                     ContextCompat.getColor(ShowAccountActivity.this, R.color.colorAccent) | ||||||
|  |             }; | ||||||
|  |             account_follow.setBackgroundTintList(new ColorStateList(states, colors)); | ||||||
|  |         } | ||||||
|  |         account_follow.setEnabled(true); | ||||||
|  |         if (relationship.isFollowing()) { | ||||||
|  |             account_follow.setImageResource(R.drawable.ic_user_minus); | ||||||
|  |             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||||
|  |                 account_follow.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(ShowAccountActivity.this, R.color.red_1))); | ||||||
|  |             } | ||||||
|  |             doAction = action.UNFOLLOW; | ||||||
|  |             account_follow.setContentDescription(getString(R.string.action_unfollow)); | ||||||
|  |             account_follow.setVisibility(View.VISIBLE); | ||||||
|  |         } else if (!relationship.isFollowing()) { | ||||||
|  |             account_follow.setImageResource(R.drawable.ic_user_plus); | ||||||
|  |             doAction = action.FOLLOW; | ||||||
|  |             account_follow.setVisibility(View.VISIBLE); | ||||||
|  |             account_follow.setContentDescription(getString(R.string.action_follow)); | ||||||
|  |         } else { | ||||||
|  |             account_follow.setVisibility(View.GONE); | ||||||
|  |             doAction = action.NOTHING; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onDestroy() { | ||||||
|  |         super.onDestroy(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onStop() { | ||||||
|  |         super.onStop(); | ||||||
|  |         if (retrieveRelationship != null && !retrieveRelationship.isCancelled()) { | ||||||
|  |             retrieveRelationship.cancel(true); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onPostAction(int statusCode, PeertubeAPI.StatusAction statusAction, String targetedId, Error error) { | ||||||
|  |  | ||||||
|  |         if (error != null) { | ||||||
|  |             Toasty.error(ShowAccountActivity.this, error.getError(), Toast.LENGTH_LONG).show(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         String target = account.getAcct(); | ||||||
|  |         //IF action is unfollow or mute, sends an intent to remove statuses | ||||||
|  |         if (statusAction == PeertubeAPI.StatusAction.UNFOLLOW ) { | ||||||
|  |             Bundle b = new Bundle(); | ||||||
|  |             b.putString("receive_action", targetedId); | ||||||
|  |             Intent intentBC = new Intent(Helper.RECEIVE_ACTION); | ||||||
|  |             intentBC.putExtras(b); | ||||||
|  |         } | ||||||
|  |         retrieveRelationship = new RetrieveRelationshipAsyncTask(ShowAccountActivity.this, target, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public enum action { | ||||||
|  |         FOLLOW, | ||||||
|  |         UNFOLLOW, | ||||||
|  |         NOTHING | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Pager adapter for the 4 fragments | ||||||
|  |      */ | ||||||
|  |     private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { | ||||||
|  |  | ||||||
|  |         ScreenSlidePagerAdapter(FragmentManager fm) { | ||||||
|  |             super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         @NotNull | ||||||
|  |         @Override | ||||||
|  |         public Fragment getItem(int position) { | ||||||
|  |             Bundle bundle = new Bundle(); | ||||||
|  |             if (position == 0) { | ||||||
|  |                 DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); | ||||||
|  |                 bundle = new Bundle(); | ||||||
|  |                 bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); | ||||||
|  |                 bundle.putString("targetedid", account.getAcct()); | ||||||
|  |                 bundle.putBoolean("showReply", false); | ||||||
|  |                 bundle.putBoolean("ischannel", ischannel); | ||||||
|  |                 displayStatusFragment.setArguments(bundle); | ||||||
|  |                 return displayStatusFragment; | ||||||
|  |             } | ||||||
|  |             DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); | ||||||
|  |             bundle.putString("targetedid", account.getId()); | ||||||
|  |             bundle.putString("instance", getLiveInstance(ShowAccountActivity.this)); | ||||||
|  |             bundle.putString("name", account.getAcct()); | ||||||
|  |             displayAccountsFragment.setArguments(bundle); | ||||||
|  |             return displayAccountsFragment; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         @Override | ||||||
|  |         public int getCount() { | ||||||
|  |             if (ischannel) | ||||||
|  |                 return 1; | ||||||
|  |             else | ||||||
|  |                 return 2; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  |  | ||||||
|  | package app.fedilab.fedilabtube.asynctasks; | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import android.os.AsyncTask; | ||||||
|  |  | ||||||
|  | import java.lang.ref.WeakReference; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.PeertubeAPI; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountInterface; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class RetrieveAccountAsyncTask extends AsyncTask<Void, Void, Void> { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private String targetedId; | ||||||
|  |     private Account account; | ||||||
|  |     private OnRetrieveAccountInterface listener; | ||||||
|  |     private Error error; | ||||||
|  |     private WeakReference<Context> contextReference; | ||||||
|  |  | ||||||
|  |     public RetrieveAccountAsyncTask(Context context, String targetedId, OnRetrieveAccountInterface onRetrieveAccountInterface) { | ||||||
|  |         this.contextReference = new WeakReference<>(context); | ||||||
|  |         this.targetedId = targetedId; | ||||||
|  |         this.listener = onRetrieveAccountInterface; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected Void doInBackground(Void... params) { | ||||||
|  |         PeertubeAPI peertubeAPI = new PeertubeAPI(this.contextReference.get()); | ||||||
|  |         account = peertubeAPI.getAccount(targetedId); | ||||||
|  |         error = peertubeAPI.getError(); | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onPostExecute(Void result) { | ||||||
|  |         listener.onRetrieveAccount(account, error); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  |  | ||||||
|  | package app.fedilab.fedilabtube.asynctasks; | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import android.os.AsyncTask; | ||||||
|  |  | ||||||
|  | import java.lang.ref.WeakReference; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.APIResponse; | ||||||
|  | import app.fedilab.fedilabtube.client.PeertubeAPI; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class RetrieveAccountsAsyncTask extends AsyncTask<Void, Void, Void> { | ||||||
|  |  | ||||||
|  |     private APIResponse apiResponse; | ||||||
|  |     private OnRetrieveAccountsInterface listener; | ||||||
|  |     private WeakReference<Context> contextReference; | ||||||
|  |     private String name; | ||||||
|  |  | ||||||
|  |     public RetrieveAccountsAsyncTask(Context context, String name, OnRetrieveAccountsInterface onRetrieveAccountsInterface) { | ||||||
|  |         this.contextReference = new WeakReference<>(context); | ||||||
|  |         this.name = name; | ||||||
|  |         this.listener = onRetrieveAccountsInterface; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected Void doInBackground(Void... params) { | ||||||
|  |         PeertubeAPI peertubeAPI = new PeertubeAPI(this.contextReference.get()); | ||||||
|  |         apiResponse = peertubeAPI.getPeertubeChannel(name); | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onPostExecute(Void result) { | ||||||
|  |         listener.onRetrieveAccounts(apiResponse); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,45 @@ | |||||||
|  |  | ||||||
|  | package app.fedilab.fedilabtube.asynctasks; | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import android.os.AsyncTask; | ||||||
|  |  | ||||||
|  | import java.lang.ref.WeakReference; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.PeertubeAPI; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Relationship; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class RetrieveRelationshipAsyncTask extends AsyncTask<Void, Void, Void> { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private String accountId; | ||||||
|  |     private Relationship relationship; | ||||||
|  |     private OnRetrieveRelationshipInterface listener; | ||||||
|  |     private Error error; | ||||||
|  |     private WeakReference<Context> contextReference; | ||||||
|  |  | ||||||
|  |     public RetrieveRelationshipAsyncTask(Context context, String accountId, OnRetrieveRelationshipInterface onRetrieveRelationshipInterface) { | ||||||
|  |         this.contextReference = new WeakReference<>(context); | ||||||
|  |         this.listener = onRetrieveRelationshipInterface; | ||||||
|  |         this.accountId = accountId; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected Void doInBackground(Void... params) { | ||||||
|  |  | ||||||
|  |         PeertubeAPI api = new PeertubeAPI(this.contextReference.get()); | ||||||
|  |         relationship = new Relationship(); | ||||||
|  |         relationship.setFollowing(api.isFollowing(accountId)); | ||||||
|  |         error = api.getError(); | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onPostExecute(Void result) { | ||||||
|  |         listener.onRetrieveRelationship(relationship, error); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -420,7 +420,7 @@ public class PeertubeAPI { | |||||||
|             account.setDisplay_name(accountObject.get("name").toString()); |             account.setDisplay_name(accountObject.get("name").toString()); | ||||||
|             account.setHost(accountObject.get("host").toString()); |             account.setHost(accountObject.get("host").toString()); | ||||||
|             account.setSocial("PEERTUBE"); |             account.setSocial("PEERTUBE"); | ||||||
|  |             account.setInstance(accountObject.getString("host")); | ||||||
|             if (accountObject.has("createdAt")) |             if (accountObject.has("createdAt")) | ||||||
|                 account.setCreated_at(Helper.mstStringToDate(accountObject.get("createdAt").toString())); |                 account.setCreated_at(Helper.mstStringToDate(accountObject.get("createdAt").toString())); | ||||||
|             else |             else | ||||||
|   | |||||||
| @@ -0,0 +1,96 @@ | |||||||
|  | package app.fedilab.fedilabtube.client.entities; | ||||||
|  |  | ||||||
|  | public class Relationship { | ||||||
|  |  | ||||||
|  |     private String id; | ||||||
|  |     private boolean following; | ||||||
|  |     private boolean followed_by; | ||||||
|  |     private boolean blocking; | ||||||
|  |     private boolean muting; | ||||||
|  |     private boolean requested; | ||||||
|  |     private boolean muting_notifications; | ||||||
|  |     private boolean endorsed; | ||||||
|  |     private boolean showing_reblogs; | ||||||
|  |     private boolean blocked_by; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public String getId() { | ||||||
|  |         return id; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setId(String id) { | ||||||
|  |         this.id = id; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isFollowing() { | ||||||
|  |         return following; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setFollowing(boolean following) { | ||||||
|  |         this.following = following; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isFollowed_by() { | ||||||
|  |         return followed_by; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setFollowed_by(boolean followed_by) { | ||||||
|  |         this.followed_by = followed_by; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isBlocking() { | ||||||
|  |         return blocking; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setBlocking(boolean blocking) { | ||||||
|  |         this.blocking = blocking; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isMuting() { | ||||||
|  |         return muting; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setMuting(boolean muting) { | ||||||
|  |         this.muting = muting; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isRequested() { | ||||||
|  |         return requested; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setRequested(boolean requested) { | ||||||
|  |         this.requested = requested; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isMuting_notifications() { | ||||||
|  |         return muting_notifications; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setMuting_notifications(boolean muting_notifications) { | ||||||
|  |         this.muting_notifications = muting_notifications; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isEndorsed() { | ||||||
|  |         return endorsed; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setEndorsed(boolean endorsed) { | ||||||
|  |         this.endorsed = endorsed; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isShowing_reblogs() { | ||||||
|  |         return showing_reblogs; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setShowing_reblogs(boolean showing_reblogs) { | ||||||
|  |         this.showing_reblogs = showing_reblogs; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isBlocked_by() { | ||||||
|  |         return blocked_by; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setBlocked_by(boolean blocked_by) { | ||||||
|  |         this.blocked_by = blocked_by; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,199 @@ | |||||||
|  | package app.fedilab.fedilabtube.drawer; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.os.Build; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.text.Html; | ||||||
|  | import android.text.util.Linkify; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | import android.widget.LinearLayout; | ||||||
|  | import android.widget.TextView; | ||||||
|  | import android.widget.Toast; | ||||||
|  |  | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import androidx.recyclerview.widget.RecyclerView; | ||||||
|  |  | ||||||
|  | import com.google.android.material.floatingactionbutton.FloatingActionButton; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.R; | ||||||
|  | import app.fedilab.fedilabtube.ShowAccountActivity; | ||||||
|  | import app.fedilab.fedilabtube.client.PeertubeAPI; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  | import app.fedilab.fedilabtube.helper.Helper; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnPostActionInterface; | ||||||
|  | import es.dmoral.toasty.Toasty; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class AccountsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements OnPostActionInterface { | ||||||
|  |  | ||||||
|  |     private List<Account> accounts; | ||||||
|  |  | ||||||
|  |     private Context context; | ||||||
|  |     private AccountsListAdapter accountsListAdapter; | ||||||
|  |     private String targetedId; | ||||||
|  |  | ||||||
|  |     public AccountsListAdapter(String targetedId, List<Account> accounts) { | ||||||
|  |         this.accounts = accounts; | ||||||
|  |         this.accountsListAdapter = this; | ||||||
|  |         this.targetedId = targetedId; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @NonNull | ||||||
|  |     @Override | ||||||
|  |     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | ||||||
|  |         context = parent.getContext(); | ||||||
|  |         LayoutInflater layoutInflater = LayoutInflater.from(context); | ||||||
|  |         return new ViewHolder(layoutInflater.inflate(R.layout.drawer_account, parent, false)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { | ||||||
|  |         final AccountsListAdapter.ViewHolder holder = (AccountsListAdapter.ViewHolder) viewHolder; | ||||||
|  |         final Account account = accounts.get(position); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         PeertubeAPI.StatusAction doAction = null; | ||||||
|  |         holder.account_follow.hide(); | ||||||
|  |  | ||||||
|  |         if (account.getDisplay_name() != null && !account.getDisplay_name().trim().equals("")) | ||||||
|  |             holder.account_dn.setText(account.getDisplay_name()); | ||||||
|  |         else | ||||||
|  |             holder.account_dn.setText(account.getUsername().replace("@", "")); | ||||||
|  |         holder.account_un.setText(String.format("@%s", account.getUsername())); | ||||||
|  |         holder.account_ac.setText(account.getAcct()); | ||||||
|  |         if (account.getUsername().equals(account.getAcct())) | ||||||
|  |             holder.account_ac.setVisibility(View.GONE); | ||||||
|  |         else | ||||||
|  |             holder.account_ac.setVisibility(View.VISIBLE); | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) | ||||||
|  |             holder.account_ds.setText(Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_LEGACY)); | ||||||
|  |         else | ||||||
|  |             holder.account_ds.setText(Html.fromHtml(account.getNote())); | ||||||
|  |         holder.account_ds.setAutoLinkMask(Linkify.WEB_URLS); | ||||||
|  |         holder.account_sc.setText(Helper.withSuffix(account.getStatuses_count())); | ||||||
|  |         holder.account_fgc.setText(Helper.withSuffix(account.getFollowing_count())); | ||||||
|  |         holder.account_frc.setText(Helper.withSuffix(account.getFollowers_count())); | ||||||
|  |         //Profile picture | ||||||
|  |         Helper.loadGiF(context, account, holder.account_pp); | ||||||
|  |         if (account.isMakingAction()) { | ||||||
|  |             holder.account_follow.setEnabled(false); | ||||||
|  |         } else { | ||||||
|  |             holder.account_follow.setEnabled(true); | ||||||
|  |         } | ||||||
|  |         //Follow button | ||||||
|  |         PeertubeAPI.StatusAction finalDoAction = doAction; | ||||||
|  |         holder.account_follow.setOnClickListener(v -> { | ||||||
|  |  | ||||||
|  |         }); | ||||||
|  |         Intent intent = new Intent(context, ShowAccountActivity.class); | ||||||
|  |         Bundle b = new Bundle(); | ||||||
|  |         b.putBoolean("peertubeaccount", true); | ||||||
|  |         b.putBoolean("ischannel", true); | ||||||
|  |         b.putString("targetedid", account.getAcct()); | ||||||
|  |         b.putParcelable("account", account); | ||||||
|  |         intent.putExtras(b); | ||||||
|  |         context.startActivity(intent); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public long getItemId(int position) { | ||||||
|  |         return position; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public int getItemCount() { | ||||||
|  |         return accounts.size(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private Account getItemAt(int position) { | ||||||
|  |         if (accounts.size() > position) | ||||||
|  |             return accounts.get(position); | ||||||
|  |         else | ||||||
|  |             return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onPostAction(int statusCode, PeertubeAPI.StatusAction statusAction, String targetedId, Error error) { | ||||||
|  |         if (error != null) { | ||||||
|  |             Toasty.error(context, error.getError(), Toast.LENGTH_LONG).show(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |      /* | ||||||
|  |         if (statusAction == PeertubeAPI.StatusAction.FOLLOW) { | ||||||
|  |             if (action == RetrieveAccountsAsyncTask.Type.CHANNELS) { | ||||||
|  |                 SQLiteDatabase db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); | ||||||
|  |                 new InstancesDAO(context, db).insertInstance(accounts.get(0).getAcct().split("@")[1], accounts.get(0).getAcct().split("@")[0], "PEERTUBE_CHANNEL"); | ||||||
|  |             } else { | ||||||
|  |                 for (Account account : accounts) { | ||||||
|  |                     if (account.getId().equals(targetedId)) { | ||||||
|  |                         account.setFollowType(Account.followAction.FOLLOW); | ||||||
|  |                         account.setMakingAction(false); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 accountsListAdapter.notifyDataSetChanged(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (statusAction == PeertubeAPI.StatusAction.UNFOLLOW) { | ||||||
|  |             for (Account account : accounts) { | ||||||
|  |                 if (account.getId().equals(targetedId)) { | ||||||
|  |                     account.setFollowType(Account.followAction.NOT_FOLLOW); | ||||||
|  |                     account.setMakingAction(false); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             accountsListAdapter.notifyDataSetChanged(); | ||||||
|  |         }*/ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void notifyAccountChanged(Account account) { | ||||||
|  |         for (int i = 0; i < accountsListAdapter.getItemCount(); i++) { | ||||||
|  |             //noinspection ConstantConditions | ||||||
|  |             if (accountsListAdapter.getItemAt(i) != null && accountsListAdapter.getItemAt(i).getId().equals(account.getId())) { | ||||||
|  |                 try { | ||||||
|  |                     accountsListAdapter.notifyItemChanged(i); | ||||||
|  |                 } catch (Exception ignored) { | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private static class ViewHolder extends RecyclerView.ViewHolder { | ||||||
|  |         ImageView account_pp; | ||||||
|  |         TextView account_ac; | ||||||
|  |         TextView account_dn; | ||||||
|  |         TextView account_un; | ||||||
|  |         TextView account_ds; | ||||||
|  |         TextView account_sc; | ||||||
|  |         TextView account_fgc; | ||||||
|  |         TextView account_frc; | ||||||
|  |         LinearLayout account_info; | ||||||
|  |         FloatingActionButton account_follow; | ||||||
|  |         LinearLayout account_container; | ||||||
|  |  | ||||||
|  |         ViewHolder(View itemView) { | ||||||
|  |             super(itemView); | ||||||
|  |             account_pp = itemView.findViewById(R.id.account_pp); | ||||||
|  |             account_dn = itemView.findViewById(R.id.account_dn); | ||||||
|  |             account_ac = itemView.findViewById(R.id.account_ac); | ||||||
|  |             account_un = itemView.findViewById(R.id.account_un); | ||||||
|  |             account_ds = itemView.findViewById(R.id.account_ds); | ||||||
|  |             account_sc = itemView.findViewById(R.id.account_sc); | ||||||
|  |             account_fgc = itemView.findViewById(R.id.account_fgc); | ||||||
|  |             account_frc = itemView.findViewById(R.id.account_frc); | ||||||
|  |             account_follow = itemView.findViewById(R.id.account_follow); | ||||||
|  |             account_info = itemView.findViewById(R.id.account_info); | ||||||
|  |             account_container = itemView.findViewById(R.id.account_container); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -3,6 +3,7 @@ package app.fedilab.fedilabtube.drawer; | |||||||
|  |  | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
|  | import android.content.SharedPreferences; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.view.LayoutInflater; | import android.view.LayoutInflater; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| @@ -20,6 +21,7 @@ import java.util.List; | |||||||
|  |  | ||||||
| import app.fedilab.fedilabtube.PeertubeActivity; | import app.fedilab.fedilabtube.PeertubeActivity; | ||||||
| import app.fedilab.fedilabtube.R; | import app.fedilab.fedilabtube.R; | ||||||
|  | import app.fedilab.fedilabtube.ShowAccountActivity; | ||||||
| import app.fedilab.fedilabtube.client.APIResponse; | import app.fedilab.fedilabtube.client.APIResponse; | ||||||
| import app.fedilab.fedilabtube.client.entities.Account; | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
| import app.fedilab.fedilabtube.client.entities.Peertube; | import app.fedilab.fedilabtube.client.entities.Peertube; | ||||||
| @@ -32,6 +34,7 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde | |||||||
|     private List<Peertube> peertubes; |     private List<Peertube> peertubes; | ||||||
|     private Context context; |     private Context context; | ||||||
|  |  | ||||||
|  |     private boolean ownVideos; | ||||||
|  |  | ||||||
|     public PeertubeAdapter(List<Peertube> peertubes) { |     public PeertubeAdapter(List<Peertube> peertubes) { | ||||||
|         this.peertubes = peertubes; |         this.peertubes = peertubes; | ||||||
| @@ -56,13 +59,18 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde | |||||||
|             peertube.setInstance(Helper.getLiveInstance(context)); |             peertube.setInstance(Helper.getLiveInstance(context)); | ||||||
|         Account account = peertube.getAccount(); |         Account account = peertube.getAccount(); | ||||||
|  |  | ||||||
|  |         SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); | ||||||
|  |         String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, ""); | ||||||
|  |  | ||||||
|  |         ownVideos = peertube.getAccount().getInstance().compareTo(Helper.getLiveInstance(context)) == 0 && peertube.getAccount().getId().compareTo(userId) == 0; | ||||||
|  |  | ||||||
|  |  | ||||||
|         holder.peertube_account_name.setText(account.getAcct()); |         holder.peertube_account_name.setText(account.getAcct()); | ||||||
|         holder.peertube_title.setText(peertube.getName()); |         holder.peertube_title.setText(peertube.getName()); | ||||||
|         holder.peertube_duration.setText(context.getString(R.string.duration_video, Helper.secondsToString(peertube.getDuration()))); |         holder.peertube_duration.setText(context.getString(R.string.duration_video, Helper.secondsToString(peertube.getDuration()))); | ||||||
|         holder.peertube_date.setText(String.format(" - %s", Helper.dateDiff(context, peertube.getCreated_at()))); |         holder.peertube_date.setText(String.format(" - %s", Helper.dateDiff(context, peertube.getCreated_at()))); | ||||||
|         holder.peertube_views.setText(context.getString(R.string.number_view_video, Helper.withSuffix(peertube.getView()))); |         holder.peertube_views.setText(context.getString(R.string.number_view_video, Helper.withSuffix(peertube.getView()))); | ||||||
|  |  | ||||||
|  |  | ||||||
|         Glide.with(holder.peertube_video_image.getContext()) |         Glide.with(holder.peertube_video_image.getContext()) | ||||||
|                 .load("https://" + peertube.getInstance() + peertube.getThumbnailPath()) |                 .load("https://" + peertube.getInstance() + peertube.getThumbnailPath()) | ||||||
|                 .into(holder.peertube_video_image); |                 .into(holder.peertube_video_image); | ||||||
| @@ -72,6 +80,15 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde | |||||||
|         } |         } | ||||||
|         Helper.loadGiF(context, account, holder.peertube_profile); |         Helper.loadGiF(context, account, holder.peertube_profile); | ||||||
|  |  | ||||||
|  |         if (!ownVideos) { | ||||||
|  |             holder.peertube_profile.setOnClickListener(v -> { | ||||||
|  |                 Intent intent = new Intent(context, ShowAccountActivity.class); | ||||||
|  |                 Bundle b = new Bundle(); | ||||||
|  |                 b.putParcelable("account", peertube.getAccount()); | ||||||
|  |                 intent.putExtras(b); | ||||||
|  |                 context.startActivity(intent); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (peertube.getHeaderType() != null && peertube.getHeaderTypeValue() != null) { |         if (peertube.getHeaderType() != null && peertube.getHeaderTypeValue() != null) { | ||||||
|             String type = peertube.getHeaderType(); |             String type = peertube.getHeaderType(); | ||||||
|   | |||||||
| @@ -0,0 +1,181 @@ | |||||||
|  | package app.fedilab.fedilabtube.fragment; | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import android.os.AsyncTask; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.RelativeLayout; | ||||||
|  | import android.widget.Toast; | ||||||
|  |  | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | import androidx.recyclerview.widget.DividerItemDecoration; | ||||||
|  | import androidx.recyclerview.widget.LinearLayoutManager; | ||||||
|  | import androidx.recyclerview.widget.RecyclerView; | ||||||
|  | import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.R; | ||||||
|  | import app.fedilab.fedilabtube.asynctasks.RetrieveAccountsAsyncTask; | ||||||
|  | import app.fedilab.fedilabtube.client.APIResponse; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
|  | import app.fedilab.fedilabtube.drawer.AccountsListAdapter; | ||||||
|  | import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface; | ||||||
|  | import es.dmoral.toasty.Toasty; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccountsInterface { | ||||||
|  |  | ||||||
|  |     private boolean flag_loading; | ||||||
|  |     private Context context; | ||||||
|  |     private AsyncTask<Void, Void, Void> asyncTask; | ||||||
|  |     private AccountsListAdapter accountsListAdapter; | ||||||
|  |     private String max_id; | ||||||
|  |     private List<Account> accounts; | ||||||
|  |     private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; | ||||||
|  |     private boolean firstLoad; | ||||||
|  |     private SwipeRefreshLayout swipeRefreshLayout; | ||||||
|  |     private String targetedId, name; | ||||||
|  |     private boolean swiped; | ||||||
|  |     private RecyclerView lv_accounts; | ||||||
|  |     private View rootView; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { | ||||||
|  |  | ||||||
|  |         rootView = inflater.inflate(R.layout.fragment_accounts, container, false); | ||||||
|  |  | ||||||
|  |         context = getContext(); | ||||||
|  |         Bundle bundle = this.getArguments(); | ||||||
|  |         accounts = new ArrayList<>(); | ||||||
|  |         if (bundle != null) { | ||||||
|  |             if (bundle.containsKey("tag")) | ||||||
|  |                 targetedId = bundle.getString("tag", null); | ||||||
|  |             else | ||||||
|  |                 targetedId = bundle.getString("targetedid", null); | ||||||
|  |             name = bundle.getString("name", null); | ||||||
|  |         } | ||||||
|  |         max_id = null; | ||||||
|  |         firstLoad = true; | ||||||
|  |         flag_loading = true; | ||||||
|  |         swiped = false; | ||||||
|  |  | ||||||
|  |         swipeRefreshLayout = rootView.findViewById(R.id.swipeContainer); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         lv_accounts = rootView.findViewById(R.id.lv_accounts); | ||||||
|  |         lv_accounts.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL)); | ||||||
|  |         mainLoader = rootView.findViewById(R.id.loader); | ||||||
|  |         nextElementLoader = rootView.findViewById(R.id.loading_next_accounts); | ||||||
|  |         textviewNoAction = rootView.findViewById(R.id.no_action); | ||||||
|  |         mainLoader.setVisibility(View.VISIBLE); | ||||||
|  |         nextElementLoader.setVisibility(View.GONE); | ||||||
|  |         accountsListAdapter = new AccountsListAdapter(targetedId, this.accounts); | ||||||
|  |         lv_accounts.setAdapter(accountsListAdapter); | ||||||
|  |  | ||||||
|  |         final LinearLayoutManager mLayoutManager; | ||||||
|  |         mLayoutManager = new LinearLayoutManager(context); | ||||||
|  |         lv_accounts.setLayoutManager(mLayoutManager); | ||||||
|  |         lv_accounts.addOnScrollListener(new RecyclerView.OnScrollListener() { | ||||||
|  |             public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { | ||||||
|  |                 if (dy > 0) { | ||||||
|  |                     int visibleItemCount = mLayoutManager.getChildCount(); | ||||||
|  |                     int totalItemCount = mLayoutManager.getItemCount(); | ||||||
|  |                     int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); | ||||||
|  |                     if (firstVisibleItem + visibleItemCount == totalItemCount) { | ||||||
|  |                         if (!flag_loading) { | ||||||
|  |                             flag_loading = true; | ||||||
|  |                             asyncTask = new RetrieveAccountsAsyncTask(context, name, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |                             nextElementLoader.setVisibility(View.VISIBLE); | ||||||
|  |                         } | ||||||
|  |                     } else { | ||||||
|  |                         nextElementLoader.setVisibility(View.GONE); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         swipeRefreshLayout.setOnRefreshListener(this::pullToRefresh); | ||||||
|  |  | ||||||
|  |         asyncTask = new RetrieveAccountsAsyncTask(context, name, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |         return rootView; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onDestroyView() { | ||||||
|  |         super.onDestroyView(); | ||||||
|  |         rootView = null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onCreate(Bundle saveInstance) { | ||||||
|  |         super.onCreate(saveInstance); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onAttach(@NonNull Context context) { | ||||||
|  |         super.onAttach(context); | ||||||
|  |         this.context = context; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void onDestroy() { | ||||||
|  |         super.onDestroy(); | ||||||
|  |         if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING) | ||||||
|  |             asyncTask.cancel(true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void scrollToTop() { | ||||||
|  |         if (lv_accounts != null) | ||||||
|  |             lv_accounts.setAdapter(accountsListAdapter); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onRetrieveAccounts(APIResponse apiResponse) { | ||||||
|  |         mainLoader.setVisibility(View.GONE); | ||||||
|  |         nextElementLoader.setVisibility(View.GONE); | ||||||
|  |         if (apiResponse.getError() != null) { | ||||||
|  |             Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); | ||||||
|  |             swipeRefreshLayout.setRefreshing(false); | ||||||
|  |             swiped = false; | ||||||
|  |             flag_loading = false; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         flag_loading = (apiResponse.getMax_id() == null); | ||||||
|  |  | ||||||
|  |         List<Account> accounts = apiResponse.getAccounts(); | ||||||
|  |         if (!swiped && firstLoad && (accounts == null || accounts.size() == 0)) | ||||||
|  |             textviewNoAction.setVisibility(View.VISIBLE); | ||||||
|  |         else | ||||||
|  |             textviewNoAction.setVisibility(View.GONE); | ||||||
|  |  | ||||||
|  |         max_id = apiResponse.getMax_id(); | ||||||
|  |  | ||||||
|  |         if (swiped) { | ||||||
|  |             accountsListAdapter = new AccountsListAdapter(targetedId, this.accounts); | ||||||
|  |             lv_accounts.setAdapter(accountsListAdapter); | ||||||
|  |             swiped = false; | ||||||
|  |         } | ||||||
|  |         if (accounts != null && accounts.size() > 0) { | ||||||
|  |             int currentPosition = this.accounts.size(); | ||||||
|  |             this.accounts.addAll(accounts); | ||||||
|  |             accountsListAdapter.notifyItemRangeChanged(currentPosition, accounts.size()); | ||||||
|  |         } | ||||||
|  |         swipeRefreshLayout.setRefreshing(false); | ||||||
|  |         firstLoad = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void pullToRefresh() { | ||||||
|  |         max_id = null; | ||||||
|  |         accounts = new ArrayList<>(); | ||||||
|  |         firstLoad = true; | ||||||
|  |         flag_loading = true; | ||||||
|  |         swiped = true; | ||||||
|  |         swipeRefreshLayout.setRefreshing(true); | ||||||
|  |         asyncTask = new RetrieveAccountsAsyncTask(context, name, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -35,13 +35,11 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; | |||||||
| import com.bumptech.glide.load.resource.bitmap.RoundedCorners; | import com.bumptech.glide.load.resource.bitmap.RoundedCorners; | ||||||
| import com.bumptech.glide.request.RequestOptions; | import com.bumptech.glide.request.RequestOptions; | ||||||
|  |  | ||||||
|  |  | ||||||
| import java.text.DateFormat; | import java.text.DateFormat; | ||||||
| import java.text.ParseException; | import java.text.ParseException; | ||||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.List; |  | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.TimeZone; | import java.util.TimeZone; | ||||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||||
| @@ -118,6 +116,8 @@ public class Helper { | |||||||
|     public static final String SET_CUSTOM_TABS = "set_custom_tabs"; |     public static final String SET_CUSTOM_TABS = "set_custom_tabs"; | ||||||
|     public static final String SET_DISPLAY_CONFIRM = "set_display_confirm"; |     public static final String SET_DISPLAY_CONFIRM = "set_display_confirm"; | ||||||
|     public static final String INTENT_ADD_UPLOADED_MEDIA = "intent_add_uploaded_media"; |     public static final String INTENT_ADD_UPLOADED_MEDIA = "intent_add_uploaded_media"; | ||||||
|  |     public static final String RECEIVE_ACTION = "receive_action"; | ||||||
|  |     public static final String SET_UNFOLLOW_VALIDATION = "set_unfollow_validation"; | ||||||
|     //List of available academies |     //List of available academies | ||||||
|  |  | ||||||
|     public static String[] academies = { |     public static String[] academies = { | ||||||
| @@ -308,6 +308,17 @@ public class Helper { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Convert a date in String -> format yyyy-MM-dd HH:mm:ss | ||||||
|  |      * | ||||||
|  |      * @param date Date | ||||||
|  |      * @return String | ||||||
|  |      */ | ||||||
|  |     public static String shortDateToString(Date date) { | ||||||
|  |         SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()); | ||||||
|  |         return df.format(date); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     public static String dateDiffFull(Date dateToot) { |     public static String dateDiffFull(Date dateToot) { | ||||||
|         SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault()); |         SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault()); | ||||||
|   | |||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | package app.fedilab.fedilabtube.interfaces; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Account; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  |  | ||||||
|  | public interface OnRetrieveAccountInterface { | ||||||
|  |     void onRetrieveAccount(Account account, Error error); | ||||||
|  | } | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | package app.fedilab.fedilabtube.interfaces; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.APIResponse; | ||||||
|  |  | ||||||
|  | public interface OnRetrieveAccountsInterface { | ||||||
|  |     void onRetrieveAccounts(APIResponse apiResponse); | ||||||
|  | } | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  |  | ||||||
|  | package app.fedilab.fedilabtube.interfaces; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Status; | ||||||
|  |  | ||||||
|  | public interface OnRetrieveFeedsAccountInterface { | ||||||
|  |     void onRetrieveFeedsAccount(List<Status> statuses); | ||||||
|  | } | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  |  | ||||||
|  | package app.fedilab.fedilabtube.interfaces; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Error; | ||||||
|  | import app.fedilab.fedilabtube.client.entities.Relationship; | ||||||
|  |  | ||||||
|  | public interface OnRetrieveRelationshipInterface { | ||||||
|  |     void onRetrieveRelationship(Relationship relationship, Error error); | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								app/src/main/res/drawable/account_pp_border.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								app/src/main/res/drawable/account_pp_border.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <shape xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  |  | ||||||
|  |     <solid android:color="@null" /> | ||||||
|  |  | ||||||
|  |     <stroke | ||||||
|  |         android:width="2dp" | ||||||
|  |         android:color="@android:color/transparent" /> | ||||||
|  |  | ||||||
|  |     <corners android:radius="4dp" /> | ||||||
|  |  | ||||||
|  |     <padding | ||||||
|  |         android:bottom="2dp" | ||||||
|  |         android:left="2dp" | ||||||
|  |         android:right="2dp" | ||||||
|  |         android:top="2dp" /> | ||||||
|  |  | ||||||
|  | </shape> | ||||||
							
								
								
									
										13
									
								
								app/src/main/res/drawable/colored_border.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/src/main/res/drawable/colored_border.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | <shape xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:shape="rectangle"> | ||||||
|  |     <solid android:color="@android:color/transparent" /> | ||||||
|  |     <stroke | ||||||
|  |         android:width="1dip" | ||||||
|  |         android:color="?colorAccent" /> | ||||||
|  |     <corners android:radius="2dp" /> | ||||||
|  |     <padding | ||||||
|  |         android:bottom="1dip" | ||||||
|  |         android:left="4dip" | ||||||
|  |         android:right="4dip" | ||||||
|  |         android:top="1dip" /> | ||||||
|  | </shape> | ||||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/default_banner.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/default_banner.xml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_arrow_back_24.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_arrow_back_24.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | <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="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/> | ||||||
|  | </vector> | ||||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_edit_24.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_edit_24.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | <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="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/> | ||||||
|  | </vector> | ||||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_more_vert_24.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_baseline_more_vert_24.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | <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,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/> | ||||||
|  | </vector> | ||||||
							
								
								
									
										9
									
								
								app/src/main/res/drawable/ic_user_minus.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/drawable/ic_user_minus.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:width="24dp" | ||||||
|  |     android:height="24dp" | ||||||
|  |     android:viewportWidth="24" | ||||||
|  |     android:viewportHeight="24"> | ||||||
|  |     <path | ||||||
|  |         android:fillColor="#fff" | ||||||
|  |         android:pathData="m9.6992,12c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4c2.21,0 4,1.79 4,4s-1.79,4 -4,4zM22.3012,10v2.3752h-6.6017v-2.3752zM9.6992,14c2.67,0 8,1.34 8,4v2h-16v-2c0,-2.66 5.33,-4 8,-4z" /> | ||||||
|  | </vector> | ||||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_user_plus.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_user_plus.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:width="24dp" | ||||||
|  |     android:height="24dp" | ||||||
|  |     android:tint="#FFFFFFFF" | ||||||
|  |     android:viewportWidth="24.0" | ||||||
|  |     android:viewportHeight="24.0"> | ||||||
|  |     <path | ||||||
|  |         android:fillColor="#FFFFFFFF" | ||||||
|  |         android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" /> | ||||||
|  | </vector> | ||||||
							
								
								
									
										434
									
								
								app/src/main/res/layout/activity_show_account.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										434
									
								
								app/src/main/res/layout/activity_show_account.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,434 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <androidx.coordinatorlayout.widget.CoordinatorLayout 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" | ||||||
|  |     android:layout_height="match_parent" | ||||||
|  |     android:fitsSystemWindows="true" | ||||||
|  |     tools:context=".ShowAccountActivity"> | ||||||
|  |  | ||||||
|  |     <com.google.android.material.appbar.AppBarLayout | ||||||
|  |         android:id="@+id/appBar" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:fitsSystemWindows="true"> | ||||||
|  |         <com.google.android.material.appbar.CollapsingToolbarLayout | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |  | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:fitsSystemWindows="true" | ||||||
|  |             app:expandedTitleMarginEnd="64dp" | ||||||
|  |             app:expandedTitleMarginStart="48dp" | ||||||
|  |             app:layout_scrollFlags="scroll"> | ||||||
|  |  | ||||||
|  |             <RelativeLayout | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content"> | ||||||
|  |  | ||||||
|  |                 <androidx.constraintlayout.widget.ConstraintLayout | ||||||
|  |                     android:id="@+id/top_banner" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="wrap_content"> | ||||||
|  |  | ||||||
|  |                     <ImageView | ||||||
|  |                         android:id="@+id/banner_pp" | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="@dimen/layout_height_header" | ||||||
|  |                         android:contentDescription="@string/profile_banner" | ||||||
|  |                         android:scaleType="centerCrop" | ||||||
|  |                         android:src="@drawable/default_banner" | ||||||
|  |                         app:layout_collapseMode="parallax" | ||||||
|  |                         app:layout_constraintTop_toTopOf="parent" /> | ||||||
|  |  | ||||||
|  |                     <ImageView | ||||||
|  |                         android:id="@+id/account_pp" | ||||||
|  |                         style="@style/Widget.AppCompat.Button.Colored" | ||||||
|  |                         android:layout_width="100dp" | ||||||
|  |                         android:layout_height="100dp" | ||||||
|  |                         android:layout_margin="10dp" | ||||||
|  |                         android:background="@drawable/account_pp_border" | ||||||
|  |                         android:contentDescription="@string/profile_picture" | ||||||
|  |                         android:padding="2dp" | ||||||
|  |                         app:layout_constraintBottom_toBottomOf="@id/banner_pp" | ||||||
|  |                         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |                         app:layout_constraintTop_toBottomOf="@id/banner_pp" | ||||||
|  |                         app:layout_scrollFlags="scroll" /> | ||||||
|  |  | ||||||
|  |                     <ImageButton | ||||||
|  |                         android:id="@+id/account_follow" | ||||||
|  |                         style="@style/Widget.AppCompat.Button.Colored" | ||||||
|  |                         android:layout_width="45dp" | ||||||
|  |                         android:layout_height="45dp" | ||||||
|  |                         android:layout_marginStart="10dp" | ||||||
|  |                         android:layout_marginTop="10dp" | ||||||
|  |                         android:contentDescription="@string/make_an_action" | ||||||
|  |                         android:scaleType="fitCenter" | ||||||
|  |                         android:visibility="gone" | ||||||
|  |                         app:layout_constraintStart_toEndOf="@id/account_pp" | ||||||
|  |                         app:layout_constraintTop_toBottomOf="@id/banner_pp" /> | ||||||
|  |  | ||||||
|  |                     <ImageButton | ||||||
|  |                         android:id="@+id/header_edit_profile" | ||||||
|  |                         style="@style/Widget.AppCompat.Button.Colored" | ||||||
|  |                         android:layout_width="45dp" | ||||||
|  |                         android:layout_height="45dp" | ||||||
|  |                         android:layout_marginStart="10dp" | ||||||
|  |                         android:layout_marginTop="10dp" | ||||||
|  |                         android:contentDescription="@string/edit_profile" | ||||||
|  |                         android:scaleType="fitCenter" | ||||||
|  |                         android:src="@drawable/ic_baseline_edit_24" | ||||||
|  |                         android:visibility="gone" | ||||||
|  |                         app:layout_constraintStart_toEndOf="@id/account_pp" | ||||||
|  |                         app:layout_constraintTop_toBottomOf="@id/banner_pp" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                     <View | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="50dp" | ||||||
|  |                         android:alpha="0.4" | ||||||
|  |                         android:background="@android:color/black" | ||||||
|  |                         app:layout_constraintTop_toTopOf="parent" /> | ||||||
|  |  | ||||||
|  |                     <ImageView | ||||||
|  |                         android:id="@+id/action_back" | ||||||
|  |                         android:layout_width="30dp" | ||||||
|  |                         android:layout_height="30dp" | ||||||
|  |                         android:layout_alignParentStart="true" | ||||||
|  |                         android:layout_marginStart="5dp" | ||||||
|  |                         android:layout_marginTop="10dp" | ||||||
|  |                         android:layout_marginEnd="10dp" | ||||||
|  |                         android:contentDescription="@string/go_back" | ||||||
|  |                         android:src="@drawable/ic_baseline_arrow_back_24" | ||||||
|  |                         android:tint="@android:color/white" | ||||||
|  |                         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |                         app:layout_constraintTop_toTopOf="parent" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                 </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
|  |  | ||||||
|  |                 <LinearLayout | ||||||
|  |                     android:id="@+id/main_header_container" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="wrap_content" | ||||||
|  |                     android:layout_below="@+id/top_banner" | ||||||
|  |                     android:gravity="center" | ||||||
|  |                     android:orientation="vertical" | ||||||
|  |                     android:paddingTop="8dp" | ||||||
|  |                     app:layout_scrollFlags="scroll|enterAlways"> | ||||||
|  |  | ||||||
|  |                     <androidx.constraintlayout.widget.ConstraintLayout | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:layout_marginTop="5dp"> | ||||||
|  |  | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:id="@+id/names_container" | ||||||
|  |                             android:layout_width="wrap_content" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:layout_gravity="center_horizontal" | ||||||
|  |                             android:gravity="center_horizontal" | ||||||
|  |                             android:orientation="vertical" | ||||||
|  |                             app:layout_constraintBottom_toBottomOf="parent" | ||||||
|  |                             app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |                             app:layout_constraintStart_toStartOf="parent" | ||||||
|  |                             app:layout_constraintTop_toTopOf="parent"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/account_dn" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_height="wrap_content" | ||||||
|  |                                 android:singleLine="true" | ||||||
|  |                                 android:textAppearance="@style/TextAppearance.AppCompat.Body1" | ||||||
|  |                                 android:textColor="?colorAccent" | ||||||
|  |                                 android:textSize="18sp" /> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/account_un" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_height="wrap_content" | ||||||
|  |                                 android:singleLine="true" | ||||||
|  |                                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                         </LinearLayout> | ||||||
|  |  | ||||||
|  |                     </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:id="@+id/account_note" | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:layout_marginTop="5dp" | ||||||
|  |                         android:gravity="center" | ||||||
|  |                         android:padding="10dp" | ||||||
|  |                         android:textIsSelectable="true" /> | ||||||
|  |  | ||||||
|  |                     <HorizontalScrollView | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:layout_marginBottom="10dp" | ||||||
|  |                         android:fillViewport="true" | ||||||
|  |                         android:scrollbars="none"> | ||||||
|  |  | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:layout_width="wrap_content" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:gravity="center_horizontal" | ||||||
|  |                             android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/account_date" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_height="wrap_content" | ||||||
|  |                                 android:layout_marginStart="3dp" | ||||||
|  |                                 android:layout_marginEnd="3dp" | ||||||
|  |                                 android:background="@drawable/colored_border" | ||||||
|  |                                 android:singleLine="true" | ||||||
|  |                                 android:textColor="?colorAccent" | ||||||
|  |                                 android:visibility="gone" /> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/account_followed_by" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_height="wrap_content" | ||||||
|  |                                 android:layout_marginStart="3dp" | ||||||
|  |                                 android:layout_marginEnd="3dp" | ||||||
|  |                                 android:background="@drawable/colored_border" | ||||||
|  |                                 android:singleLine="true" | ||||||
|  |                                 android:text="@string/followed_by" | ||||||
|  |                                 android:textColor="?colorAccent" | ||||||
|  |                                 android:visibility="gone" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                         </LinearLayout> | ||||||
|  |  | ||||||
|  |                     </HorizontalScrollView> | ||||||
|  |                     <!-- Fields container --> | ||||||
|  |                     <LinearLayout | ||||||
|  |                         android:id="@+id/fields_container" | ||||||
|  |  | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:orientation="vertical" | ||||||
|  |                         android:visibility="gone"> | ||||||
|  |                         <!-- Fields 1 to 4 --> | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:id="@+id/field1" | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:orientation="horizontal" | ||||||
|  |                             android:visibility="gone"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/label1" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_gravity="center" | ||||||
|  |                                 android:layout_weight="1" | ||||||
|  |                                 android:gravity="center" | ||||||
|  |                                 android:minHeight="20dp" | ||||||
|  |                                 android:padding="5dp" | ||||||
|  |                                 android:paddingTop="10dp" | ||||||
|  |                                 android:paddingBottom="10dp" | ||||||
|  |                                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |                             <LinearLayout | ||||||
|  |                                 android:id="@+id/value1BG" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |  | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_weight="2" | ||||||
|  |                                 android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                                 <TextView | ||||||
|  |                                     android:id="@+id/value1" | ||||||
|  |                                     android:layout_width="match_parent" | ||||||
|  |                                     android:layout_height="match_parent" | ||||||
|  |                                     android:layout_gravity="center" | ||||||
|  |                                     android:gravity="center" | ||||||
|  |                                     android:paddingTop="10dp" | ||||||
|  |                                     android:paddingBottom="10dp" | ||||||
|  |                                     android:textIsSelectable="true" /> | ||||||
|  |  | ||||||
|  |                             </LinearLayout> | ||||||
|  |                         </LinearLayout> | ||||||
|  |  | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:id="@+id/field2" | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:orientation="horizontal" | ||||||
|  |                             android:visibility="gone"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/label2" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_gravity="center" | ||||||
|  |                                 android:layout_weight="1" | ||||||
|  |                                 android:gravity="center" | ||||||
|  |                                 android:minHeight="20dp" | ||||||
|  |                                 android:padding="10dp" | ||||||
|  |                                 android:paddingTop="5dp" | ||||||
|  |                                 android:paddingBottom="5dp" | ||||||
|  |                                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |                             <LinearLayout | ||||||
|  |                                 android:id="@+id/value2BG" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |  | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_weight="2" | ||||||
|  |                                 android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                                 <TextView | ||||||
|  |                                     android:id="@+id/value2" | ||||||
|  |                                     android:layout_width="match_parent" | ||||||
|  |                                     android:layout_height="match_parent" | ||||||
|  |                                     android:layout_gravity="center" | ||||||
|  |                                     android:gravity="center" | ||||||
|  |                                     android:paddingTop="10dp" | ||||||
|  |                                     android:paddingBottom="10dp" | ||||||
|  |                                     android:textIsSelectable="true" /> | ||||||
|  |  | ||||||
|  |                             </LinearLayout> | ||||||
|  |                         </LinearLayout> | ||||||
|  |  | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:id="@+id/field3" | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:orientation="horizontal" | ||||||
|  |                             android:visibility="gone"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/label3" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_gravity="center" | ||||||
|  |                                 android:layout_weight="1" | ||||||
|  |                                 android:gravity="center" | ||||||
|  |                                 android:minHeight="20dp" | ||||||
|  |                                 android:padding="10dp" | ||||||
|  |                                 android:paddingTop="5dp" | ||||||
|  |                                 android:paddingBottom="5dp" | ||||||
|  |                                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |                             <LinearLayout | ||||||
|  |                                 android:id="@+id/value3BG" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_weight="2" | ||||||
|  |                                 android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                                 <TextView | ||||||
|  |                                     android:id="@+id/value3" | ||||||
|  |                                     android:layout_width="match_parent" | ||||||
|  |                                     android:layout_height="match_parent" | ||||||
|  |                                     android:layout_gravity="center" | ||||||
|  |                                     android:gravity="center" | ||||||
|  |                                     android:paddingTop="10dp" | ||||||
|  |                                     android:paddingBottom="10dp" | ||||||
|  |                                     android:textIsSelectable="true" /> | ||||||
|  |                             </LinearLayout> | ||||||
|  |                         </LinearLayout> | ||||||
|  |  | ||||||
|  |                         <LinearLayout | ||||||
|  |                             android:id="@+id/field4" | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content" | ||||||
|  |                             android:orientation="horizontal" | ||||||
|  |                             android:visibility="gone"> | ||||||
|  |  | ||||||
|  |                             <TextView | ||||||
|  |                                 android:id="@+id/label4" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_gravity="center" | ||||||
|  |                                 android:layout_weight="1" | ||||||
|  |                                 android:gravity="center" | ||||||
|  |                                 android:minHeight="20dp" | ||||||
|  |                                 android:padding="10dp" | ||||||
|  |                                 android:paddingTop="5dp" | ||||||
|  |                                 android:paddingBottom="5dp" | ||||||
|  |                                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |                             <LinearLayout | ||||||
|  |                                 android:id="@+id/value4BG" | ||||||
|  |                                 android:layout_width="0dp" | ||||||
|  |                                 android:layout_height="match_parent" | ||||||
|  |                                 android:layout_weight="2" | ||||||
|  |                                 android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                                 <TextView | ||||||
|  |                                     android:id="@+id/value4" | ||||||
|  |                                     android:layout_width="match_parent" | ||||||
|  |                                     android:layout_height="match_parent" | ||||||
|  |                                     android:layout_gravity="center" | ||||||
|  |                                     android:gravity="center" | ||||||
|  |                                     android:paddingTop="10dp" | ||||||
|  |                                     android:paddingBottom="10dp" | ||||||
|  |                                     android:textIsSelectable="true" /> | ||||||
|  |                             </LinearLayout> | ||||||
|  |  | ||||||
|  |                         </LinearLayout> | ||||||
|  |                     </LinearLayout> | ||||||
|  |                     <!-- End Fields container --> | ||||||
|  |                 </LinearLayout> | ||||||
|  |             </RelativeLayout> | ||||||
|  |  | ||||||
|  |         </com.google.android.material.appbar.CollapsingToolbarLayout> | ||||||
|  |  | ||||||
|  |         <androidx.appcompat.widget.Toolbar | ||||||
|  |             android:id="@+id/toolbar" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:minHeight="?attr/actionBarSize" | ||||||
|  |             app:layout_collapseMode="pin" | ||||||
|  |             app:theme="@style/ThemeOverlay.AppCompat.Light"> | ||||||
|  |  | ||||||
|  |             <LinearLayout | ||||||
|  |                 android:id="@+id/toolbar_content" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:animationCache="true" | ||||||
|  |                 android:orientation="horizontal" | ||||||
|  |                 android:visibility="gone"> | ||||||
|  |  | ||||||
|  |                 <ImageView | ||||||
|  |                     android:id="@+id/pp_actionBar" | ||||||
|  |                     android:layout_width="30dp" | ||||||
|  |                     android:layout_height="30dp" | ||||||
|  |                     android:layout_gravity="center_vertical" | ||||||
|  |                     android:layout_marginEnd="10dp" | ||||||
|  |                     android:contentDescription="@string/profile_picture" | ||||||
|  |                     android:gravity="center_vertical" /> | ||||||
|  |  | ||||||
|  |                 <TextView | ||||||
|  |                     android:id="@+id/show_account_title" | ||||||
|  |                     android:layout_width="0dp" | ||||||
|  |                     android:layout_height="wrap_content" | ||||||
|  |                     android:layout_gravity="center_vertical" | ||||||
|  |                     android:layout_marginStart="5dp" | ||||||
|  |                     android:layout_weight="1" | ||||||
|  |                     android:singleLine="true" | ||||||
|  |                     android:textSize="14sp" /> | ||||||
|  |             </LinearLayout> | ||||||
|  |         </androidx.appcompat.widget.Toolbar> | ||||||
|  |         <com.google.android.material.tabs.TabLayout | ||||||
|  |             android:id="@+id/account_tabLayout" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             app:tabGravity="fill" | ||||||
|  |             app:tabMode="fixed" | ||||||
|  |             app:tabSelectedTextColor="?colorAccent" /> | ||||||
|  |     </com.google.android.material.appbar.AppBarLayout> | ||||||
|  |  | ||||||
|  |     <androidx.viewpager.widget.ViewPager | ||||||
|  |         android:id="@+id/account_viewpager" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         app:layout_behavior="@string/appbar_scrolling_view_behavior" /> | ||||||
|  |  | ||||||
|  | </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||||
							
								
								
									
										158
									
								
								app/src/main/res/layout/drawer_account.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								app/src/main/res/layout/drawer_account.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     android:id="@+id/main_container" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="wrap_content" | ||||||
|  |     android:layout_marginTop="5dp" | ||||||
|  |     android:layout_marginBottom="5dp" | ||||||
|  |     android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |     <ImageView | ||||||
|  |         android:id="@+id/account_pp" | ||||||
|  |         android:layout_width="60dp" | ||||||
|  |         android:layout_height="60dp" | ||||||
|  |         android:layout_gravity="center_horizontal" | ||||||
|  |         android:contentDescription="@string/profile_picture" /> | ||||||
|  |  | ||||||
|  |     <LinearLayout | ||||||
|  |         android:id="@+id/account_container" | ||||||
|  |         android:layout_width="0dp" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginStart="20dp" | ||||||
|  |         android:layout_weight="1" | ||||||
|  |         android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |         <LinearLayout | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/account_dn" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:singleLine="true" | ||||||
|  |                 android:textAppearance="@style/TextAppearance.AppCompat.Body1" | ||||||
|  |                 android:textSize="18sp" /> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/account_un" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:singleLine="true" | ||||||
|  |                 android:textSize="14sp" /> | ||||||
|  |         </LinearLayout> | ||||||
|  |  | ||||||
|  |         <TextView | ||||||
|  |             android:id="@+id/account_ac" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_marginTop="10dp" | ||||||
|  |             android:singleLine="true" | ||||||
|  |             android:textSize="16sp" | ||||||
|  |             android:visibility="gone" /> | ||||||
|  |  | ||||||
|  |         <LinearLayout | ||||||
|  |             android:id="@+id/account_info" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_marginTop="10dp" | ||||||
|  |             android:orientation="vertical" | ||||||
|  |             android:visibility="gone"> | ||||||
|  |  | ||||||
|  |             <LinearLayout | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:baselineAligned="false" | ||||||
|  |                 android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |                 <LinearLayout | ||||||
|  |                     android:layout_width="0dp" | ||||||
|  |                     android:layout_height="wrap_content" | ||||||
|  |                     android:layout_weight="1" | ||||||
|  |                     android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:singleLine="true" | ||||||
|  |                         android:text="@string/videos" /> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:id="@+id/account_sc" | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" /> | ||||||
|  |                 </LinearLayout> | ||||||
|  |  | ||||||
|  |                 <LinearLayout | ||||||
|  |                     android:layout_width="0dp" | ||||||
|  |                     android:layout_height="wrap_content" | ||||||
|  |                     android:layout_weight="1" | ||||||
|  |                     android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:singleLine="true" | ||||||
|  |                         android:text="@string/following" /> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:id="@+id/account_fgc" | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" /> | ||||||
|  |                 </LinearLayout> | ||||||
|  |  | ||||||
|  |                 <LinearLayout | ||||||
|  |                     android:layout_width="0dp" | ||||||
|  |                     android:layout_height="wrap_content" | ||||||
|  |                     android:layout_weight="1" | ||||||
|  |                     android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:singleLine="true" | ||||||
|  |                         android:text="@string/followers" /> | ||||||
|  |  | ||||||
|  |                     <TextView | ||||||
|  |                         android:id="@+id/account_frc" | ||||||
|  |                         android:layout_width="match_parent" | ||||||
|  |                         android:layout_height="wrap_content" /> | ||||||
|  |                 </LinearLayout> | ||||||
|  |             </LinearLayout> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/account_ds" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:animateLayoutChanges="true" | ||||||
|  |                 android:autoLink="web" /> | ||||||
|  |         </LinearLayout> | ||||||
|  |  | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     <LinearLayout | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_gravity="center_vertical" | ||||||
|  |         android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |         <com.google.android.material.floatingactionbutton.FloatingActionButton | ||||||
|  |             android:id="@+id/account_follow" | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_gravity="center" | ||||||
|  |             android:layout_margin="5dp" | ||||||
|  |             android:contentDescription="@string/action_follow" | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:scaleType="fitXY" | ||||||
|  |             android:visibility="gone" | ||||||
|  |             app:backgroundTint="?colorAccent" | ||||||
|  |             app:fabSize="mini" | ||||||
|  |             /> | ||||||
|  |  | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  | </LinearLayout> | ||||||
							
								
								
									
										68
									
								
								app/src/main/res/layout/fragment_accounts.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								app/src/main/res/layout/fragment_accounts.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent" | ||||||
|  |     android:paddingLeft="@dimen/fab_margin" | ||||||
|  |     android:paddingRight="@dimen/fab_margin"> | ||||||
|  |     <!-- Listview Accounts --> | ||||||
|  |     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout | ||||||
|  |         android:id="@+id/swipeContainer" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent"> | ||||||
|  |  | ||||||
|  |         <androidx.recyclerview.widget.RecyclerView | ||||||
|  |             android:id="@+id/lv_accounts" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:divider="@null" | ||||||
|  |             android:scrollbars="none" /> | ||||||
|  |     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> | ||||||
|  |  | ||||||
|  |     <RelativeLayout | ||||||
|  |         android:id="@+id/no_action" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:visibility="gone"> | ||||||
|  |  | ||||||
|  |         <TextView | ||||||
|  |             android:id="@+id/no_action_text" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |             android:layout_gravity="center" | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:padding="10dp" | ||||||
|  |             android:text="@string/no_channels" | ||||||
|  |             android:textSize="25sp" | ||||||
|  |             android:textStyle="italic|bold" | ||||||
|  |             android:typeface="serif" /> | ||||||
|  |     </RelativeLayout> | ||||||
|  |     <!-- Main Loader --> | ||||||
|  |     <RelativeLayout | ||||||
|  |         android:id="@+id/loader" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:gravity="center" | ||||||
|  |         android:visibility="gone"> | ||||||
|  |  | ||||||
|  |         <ProgressBar | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:indeterminate="true" /> | ||||||
|  |     </RelativeLayout> | ||||||
|  |     <!-- Loader for next accounts --> | ||||||
|  |     <RelativeLayout | ||||||
|  |         android:id="@+id/loading_next_accounts" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="20dp" | ||||||
|  |         android:layout_alignParentBottom="true" | ||||||
|  |         android:layout_gravity="bottom|center_horizontal" | ||||||
|  |         android:gravity="bottom|center_horizontal" | ||||||
|  |         android:visibility="gone"> | ||||||
|  |  | ||||||
|  |         <ProgressBar | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |             android:indeterminate="true" /> | ||||||
|  |     </RelativeLayout> | ||||||
|  | </RelativeLayout> | ||||||
|  |  | ||||||
| @@ -7,4 +7,5 @@ | |||||||
|     <color name="positive_thumbs">#2b90d9</color> |     <color name="positive_thumbs">#2b90d9</color> | ||||||
|     <color name="negative_thumbs">#F44336</color> |     <color name="negative_thumbs">#F44336</color> | ||||||
|  |  | ||||||
|  |     <color name="red_1">#F44336</color> | ||||||
| </resources> | </resources> | ||||||
| @@ -4,4 +4,5 @@ | |||||||
|     <dimen name="activity_vertical_margin">16dp</dimen> |     <dimen name="activity_vertical_margin">16dp</dimen> | ||||||
|     <dimen name="fab_margin">5dp</dimen> |     <dimen name="fab_margin">5dp</dimen> | ||||||
|     <dimen name="drawer_padding">2dp</dimen> |     <dimen name="drawer_padding">2dp</dimen> | ||||||
|  |     <dimen name="layout_height_header">180dp</dimen> | ||||||
| </resources> | </resources> | ||||||
| @@ -97,4 +97,20 @@ | |||||||
|     <string name="change_instance">Changer d\'instance</string> |     <string name="change_instance">Changer d\'instance</string> | ||||||
|     <string name="account">Compte</string> |     <string name="account">Compte</string> | ||||||
|     <string name="instance_choice">Choisissez une instance</string> |     <string name="instance_choice">Choisissez une instance</string> | ||||||
|  |     <string name="toast_error_loading_account">Une erreur s’est produite pendant le chargement du compte !</string> | ||||||
|  |     <string name="profile_banner">Bannière du profil</string> | ||||||
|  |     <string name="make_an_action">Faire une action</string> | ||||||
|  |     <string name="go_back">Retour</string> | ||||||
|  |     <string name="open_menu">Ouvrir le menu</string> | ||||||
|  |     <string name="display_more">Afficher plus</string> | ||||||
|  |     <string name="edit_profile">Éditer le profil</string> | ||||||
|  |     <string name="followed_by">Vous suit</string> | ||||||
|  |     <string name="no_channels">Aucune chaîne !</string> | ||||||
|  |     <string name="following">Suit</string> | ||||||
|  |     <string name="followers">Abonné·e·s</string> | ||||||
|  |     <string name="nothing_to_do">Aucune action ne peut être réalisée</string> | ||||||
|  |     <string name="unfollow_confirm">Voulez-vous vous désabonner de ce compte ?</string> | ||||||
|  |     <string name="action_unfollow">Se désabonner</string> | ||||||
|  |     <string name="action_follow">Suivre</string> | ||||||
|  |  | ||||||
| </resources> | </resources> | ||||||
| @@ -9,4 +9,14 @@ | |||||||
|         <item name="colorAccent">@color/colorAccent</item> |         <item name="colorAccent">@color/colorAccent</item> | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     <!-- Base application theme. --> | ||||||
|  |     <style name="AppThemeNoActionBar" parent="Theme.AppCompat.Light.NoActionBar"> | ||||||
|  |         <!-- Customize your theme here. --> | ||||||
|  |         <item name="colorPrimary">@color/colorPrimary</item> | ||||||
|  |         <item name="colorPrimaryDark">@color/colorPrimaryDark</item> | ||||||
|  |         <item name="colorAccent">@color/colorAccent</item> | ||||||
|  |     </style> | ||||||
|  |  | ||||||
|  |  | ||||||
| </resources> | </resources> | ||||||
		Reference in New Issue
	
	Block a user