From f1ef8ef4b388f0da8765767191bcbdda8f6e3958 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Sun, 1 Mar 2020 18:05:13 +0100 Subject: #285 Migrate from ButterKnife to ViewBinding --- app/build.gradle | 4 - .../nextcloud/deck/ui/AboutActivity.java | 51 ++----- .../niedermann/nextcloud/deck/ui/EditActivity.java | 93 ++++--------- .../nextcloud/deck/ui/SettingsActivity.java | 12 +- .../ui/about/AboutFragmentContributingTab.java | 36 ++--- .../deck/ui/about/AboutFragmentCreditsTab.java | 53 +++----- .../deck/ui/about/AboutFragmentLicenseTab.java | 33 ++--- .../deck/ui/board/AccessControlAdapter.java | 83 +++++------- .../deck/ui/board/AccessControlDialogFragment.java | 40 ++---- .../nextcloud/deck/ui/board/BoardAdapter.java | 15 +-- .../deck/ui/board/EditBoardDialogFragment.java | 43 +++--- .../nextcloud/deck/ui/card/ActivityAdapter.java | 33 ++--- .../nextcloud/deck/ui/card/AttachmentAdapter.java | 106 +++++++++------ .../deck/ui/card/AttachmentDialogFragment.java | 21 +-- .../deck/ui/card/CardActivityFragment.java | 66 +++------- .../deck/ui/card/CardAttachmentsFragment.java | 58 +++----- .../deck/ui/card/CardDetailsFragment.java | 146 ++++++++------------- .../nextcloud/deck/ui/card/CardTabAdapter.java | 22 +--- .../deck/ui/card/CommentDialogFragment.java | 18 +-- .../deck/ui/card/LabelAutoCompleteAdapter.java | 40 ++---- .../deck/ui/card/UserAutoCompleteAdapter.java | 42 +++--- .../deck/ui/exception/ExceptionActivity.java | 53 +++----- .../deck/ui/helper/colorchooser/ColorChooser.java | 26 ++-- .../deck/ui/helper/dnd/CrossTabDragAndDrop.java | 30 ++--- .../deck/ui/settings/SettingsFragment.java | 17 +-- .../deck/ui/stack/EditStackDialogFragment.java | 22 ++-- app/src/main/res/layout/activity_about.xml | 4 +- .../layout/fragment_card_edit_tab_activities.xml | 4 +- .../layout/fragment_card_edit_tab_attachments.xml | 2 +- 29 files changed, 416 insertions(+), 757 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5c0bd0976..0e3576fed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,10 +58,6 @@ dependencies { // --- UI-Libraries --- // -------------------- - // Butterknife - implementation 'com.jakewharton:butterknife:10.2.1' - annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1' - // Glide implementation 'com.github.bumptech.glide:glide:4.10.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/AboutActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/AboutActivity.java index a72cbe666..04ee232e3 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/AboutActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/AboutActivity.java @@ -4,19 +4,13 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; -import androidx.viewpager.widget.ViewPager; -import com.google.android.material.tabs.TabLayout; - -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ActivityAboutBinding; import it.niedermann.nextcloud.deck.ui.about.AboutFragmentContributingTab; import it.niedermann.nextcloud.deck.ui.about.AboutFragmentCreditsTab; import it.niedermann.nextcloud.deck.ui.about.AboutFragmentLicenseTab; @@ -24,43 +18,30 @@ import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; public class AboutActivity extends AppCompatActivity { - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.pager) - ViewPager mViewPager; - @BindView(R.id.tabs) - TabLayout mTabLayout; - - @BindString(R.string.about_credits_tab_title) - String creditsTitle; - @BindString(R.string.about_license_tab_title) - String licenseTitle; - @BindString(R.string.about_contribution_tab_title) - String contributionTitle; - @Override protected void onCreate(Bundle savedInstanceState) { setTheme(Application.getAppTheme(this) ? R.style.DarkAppTheme : R.style.AppTheme); super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler(this)); - setContentView(R.layout.activity_about); - ButterKnife.bind(this); - setSupportActionBar(toolbar); - mViewPager.setAdapter(new TabsPagerAdapter(getSupportFragmentManager())); - mTabLayout.setupWithViewPager(mViewPager); + ActivityAboutBinding binding = ActivityAboutBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.toolbar); + binding.viewPager.setAdapter(new TabsPagerAdapter(getSupportFragmentManager())); + binding.tabLayout.setupWithViewPager(binding.viewPager); } private class TabsPagerAdapter extends FragmentPagerAdapter { - private final int PAGE_COUNT = 3; + @SuppressWarnings("WeakerAccess") public TabsPagerAdapter(FragmentManager fragmentManager) { - super(fragmentManager); + super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public int getCount() { - return PAGE_COUNT; + return 3; } /** @@ -72,13 +53,10 @@ public class AboutActivity extends AppCompatActivity { switch (position) { case 0: return new AboutFragmentCreditsTab(); - case 1: return new AboutFragmentContributingTab(); - case 2: return new AboutFragmentLicenseTab(); - default: throw new IllegalArgumentException("position must be between 0 and 2"); } @@ -91,14 +69,11 @@ public class AboutActivity extends AppCompatActivity { public CharSequence getPageTitle(int position) { switch (position) { case 0: - return creditsTitle; - + return getString(R.string.about_credits_tab_title); case 1: - return contributionTitle; - + return getString(R.string.about_contribution_tab_title); case 2: - return licenseTitle; - + return getString(R.string.about_license_tab_title); default: throw new IllegalArgumentException("position must be between 0 and 2"); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java index 551da3466..98836e833 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java @@ -11,17 +11,12 @@ import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; -import android.widget.EditText; import android.widget.SpinnerAdapter; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.AppCompatSpinner; -import androidx.appcompat.widget.Toolbar; -import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; -import com.google.android.material.textfield.TextInputLayout; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; @@ -31,13 +26,10 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.Unbinder; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ActivityEditBinding; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Card; @@ -64,33 +56,9 @@ public class EditActivity extends AppCompatActivity implements CommentDialogFragment.AddCommentListener, AdapterView.OnItemSelectedListener { - SyncManager syncManager; - - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.titleTextInputLayout) - TextInputLayout titleTextInputLayout; - @BindView(R.id.title) - EditText title; - @BindView(R.id.selectBoardWrapper) - View selectBoardWrapper; - @BindView(R.id.boardSelector) - AppCompatSpinner boardSelector; - @BindView(R.id.tab_layout) - TabLayout tabLayout; - @BindView(R.id.pager) - ViewPager pager; - - @BindString(R.string.shared_preference_last_board_for_account_) - String sharedPreferencesLastBoardForAccount_; - @BindString(R.string.shared_preference_last_stack_for_account_and_board_) - String sharedPreferencesLastStackForAccountAndBoard_; - @BindString(R.string.simple_add) - String add; - @BindString(R.string.edit) - String edit; - - private Unbinder unbinder; + private ActivityEditBinding binding; + + private SyncManager syncManager; private FullCard originalCard; private FullCard fullCard; @@ -110,10 +78,10 @@ public class EditActivity extends AppCompatActivity implements super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler(this)); - setContentView(R.layout.activity_edit); - unbinder = ButterKnife.bind(this); + binding = ActivityEditBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - setSupportActionBar(toolbar); + setSupportActionBar(binding.toolbar); Bundle extras = getIntent().getExtras(); if (extras == null) { @@ -132,7 +100,7 @@ public class EditActivity extends AppCompatActivity implements SingleSignOnAccount ssoa = SingleAccountHelper.getCurrentSingleSignOnAccount(this); syncManager.readAccount(ssoa.name).observe(this, (Account account) -> { accountId = account.getId(); - selectBoardWrapper.setVisibility(View.VISIBLE); + binding.selectBoardWrapper.setVisibility(View.VISIBLE); syncManager.getBoards(account.getId()).observe(this, (List boardsList) -> { for (Board board : boardsList) { if (!board.isPermissionEdit()) { @@ -142,19 +110,19 @@ public class EditActivity extends AppCompatActivity implements Board[] boardsArray = new Board[boardsList.size()]; boardsArray = boardsList.toArray(boardsArray); SpinnerAdapter adapter = new BoardAdapter(this, boardsArray); - boardSelector.setAdapter(adapter); + binding.boardSelector.setAdapter(adapter); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - long lastBoardId = sharedPreferences.getLong(sharedPreferencesLastBoardForAccount_ + accountId, 0L); + long lastBoardId = sharedPreferences.getLong(getString(R.string.shared_preference_last_board_for_account_) + accountId, 0L); DeckLog.log("--- Read: shared_preference_last_board_for_account_" + account.getId() + " | " + lastBoardId); if (lastBoardId != 0L) { for (int i = 0; i < boardsArray.length; i++) { if (boardsArray[i].getLocalId() == lastBoardId) { - boardSelector.setSelection(i); + binding.boardSelector.setSelection(i); } } } - boardSelector.setOnItemSelectedListener(this); + binding.boardSelector.setOnItemSelectedListener(this); }); }); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { @@ -234,29 +202,29 @@ public class EditActivity extends AppCompatActivity implements } private void setupViewPager() { - tabLayout.removeAllTabs(); - tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); + binding.tabLayout.removeAllTabs(); + binding.tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); CardTabAdapter adapter = new CardTabAdapter(getSupportFragmentManager(), this, accountId, localId, boardId, canEdit); - pager.setOffscreenPageLimit(2); - pager.setAdapter(adapter); - tabLayout.setupWithViewPager(pager); + binding.pager.setOffscreenPageLimit(2); + binding.pager.setAdapter(adapter); + binding.tabLayout.setupWithViewPager(binding.pager); } private void setupTitle(boolean createMode) { - title.setText(fullCard.getCard().getTitle()); + binding.title.setText(fullCard.getCard().getTitle()); if (canEdit) { if (createMode) { - title.requestFocus(); + binding.title.requestFocus(); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); if (fullCard.getCard().getTitle() != null) { - title.setSelection(fullCard.getCard().getTitle().length()); + binding.title.setSelection(fullCard.getCard().getTitle().length()); } } - titleTextInputLayout.setHint(createMode ? add : edit); - title.addTextChangedListener(new TextWatcher() { + binding.titleTextInputLayout.setHint(getString(createMode ? R.string.simple_add : R.string.edit)); + binding.title.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - fullCard.getCard().setTitle(title.getText().toString()); + fullCard.getCard().setTitle(binding.title.getText().toString()); } @Override @@ -268,23 +236,16 @@ public class EditActivity extends AppCompatActivity implements } }); } else { - titleTextInputLayout.setHintEnabled(false); - title.setEnabled(false); + binding.titleTextInputLayout.setHintEnabled(false); + binding.title.setEnabled(false); } } - @Override - protected void onDestroy() { - super.onDestroy(); - unbinder.unbind(); - } - @Override public void onDescriptionChanged(String description) { this.fullCard.getCard().setDescription(description); } - @Override public void onUserAdded(User user) { this.fullCard.getAssignedUsers().add(user); @@ -336,12 +297,12 @@ public class EditActivity extends AppCompatActivity implements @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - boardId = ((Board) boardSelector.getItemAtPosition(position)).getLocalId(); + boardId = ((Board) binding.boardSelector.getItemAtPosition(position)).getLocalId(); observeOnce(syncManager.getFullBoardById(accountId, boardId), EditActivity.this, (fullBoard -> { canEdit = fullBoard.getBoard().isPermissionEdit(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - long savedStackId = sharedPreferences.getLong(sharedPreferencesLastStackForAccountAndBoard_ + accountId + "_" + boardId, 0L); + long savedStackId = sharedPreferences.getLong(getString(R.string.shared_preference_last_stack_for_account_and_board_) + accountId + "_" + boardId, 0L); DeckLog.log("--- Read: shared_preference_last_stack_for_account_and_board" + accountId + "_" + boardId + " | " + savedStackId); if (savedStackId == 0L) { observeOnce(syncManager.getStacksForBoard(accountId, boardId), EditActivity.this, (stacks -> { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/SettingsActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/SettingsActivity.java index ee019853c..eeac3f496 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/SettingsActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/SettingsActivity.java @@ -4,18 +4,14 @@ import android.os.Bundle; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ActivitySettingsBinding; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; import it.niedermann.nextcloud.deck.ui.settings.SettingsFragment; public class SettingsActivity extends AppCompatActivity { - @BindView(R.id.toolbar) - Toolbar toolbar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -23,10 +19,10 @@ public class SettingsActivity extends AppCompatActivity { super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler(this)); - setContentView(R.layout.activity_settings); - ButterKnife.bind(this); + ActivitySettingsBinding binding = ActivitySettingsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - setSupportActionBar(toolbar); + setSupportActionBar(binding.toolbar); setResult(RESULT_OK); getFragmentManager().beginTransaction() diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentContributingTab.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentContributingTab.java index 616158102..9454ce461 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentContributingTab.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentContributingTab.java @@ -1,49 +1,37 @@ package it.niedermann.nextcloud.deck.ui.about; -import android.content.res.Resources; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.FragmentAboutContributionTabBinding; import it.niedermann.nextcloud.deck.util.LinkUtil; public class AboutFragmentContributingTab extends Fragment { - @BindView(R.id.about_source) - TextView aboutSource; - @BindView(R.id.about_issues) - TextView aboutIssues; - @BindView(R.id.about_translate) - TextView aboutTranslate; - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_about_contribution_tab, container, false); - Resources resources = v.getResources(); - ButterKnife.bind(this, v); - LinkUtil.setHtml(aboutSource, - resources.getString( + FragmentAboutContributionTabBinding binding = FragmentAboutContributionTabBinding.inflate(inflater, container, false); + LinkUtil.setHtml(binding.aboutSource, + getString( R.string.about_source, - LinkUtil.makeLink(resources, R.string.url_source, R.string.url_source) + LinkUtil.makeLink(getResources(), R.string.url_source, R.string.url_source) )); - LinkUtil.setHtml(aboutIssues, - resources.getString( + LinkUtil.setHtml(binding.aboutIssues, + getString( R.string.about_issues, - LinkUtil.makeLink(resources, R.string.url_issues, R.string.url_issues) + LinkUtil.makeLink(getResources(), R.string.url_issues, R.string.url_issues) )); - LinkUtil.setHtml(aboutTranslate, - resources.getString( + LinkUtil.setHtml(binding.aboutTranslate, + getString( R.string.about_translate, - LinkUtil.makeLink(resources, R.string.url_translations, R.string.url_translations) + LinkUtil.makeLink(getResources(), R.string.url_translations, R.string.url_translations) )); - return v; + return binding.getRoot(); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java index 5411e6b22..5fc55f10e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java @@ -11,18 +11,15 @@ import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.BuildConfig; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.api.IResponseCallback; +import it.niedermann.nextcloud.deck.databinding.FragmentAboutCreditsTabBinding; import it.niedermann.nextcloud.deck.exceptions.OfflineException; import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; @@ -33,66 +30,46 @@ public class AboutFragmentCreditsTab extends Fragment { private static final int BACKGROUND_SYNC_NEVER_EXECUTED = -1; - @BindView(R.id.about_version) - TextView aboutVersion; - @BindView(R.id.about_server_app_version) - TextView aboutServerAppVersion; - @BindView(R.id.about_maintainer) - TextView aboutMaintainer; - @BindView(R.id.about_translators) - TextView aboutTranslators; - @BindView(R.id.last_background_sync) - TextView lastBackgroundSyncExecutionTime; - - @BindString(R.string.shared_preference_last_background_sync) - String sharedPreferencesLastBackgroundSync; - @BindString(R.string.pref_key_background_sync) - String sharedPreferencesBackgroundSync; - @BindString(R.string.pref_value_background_sync_off) - String backgroundSyncOffValue; - @BindString(R.string.you_are_currently_offline) - String offlineText; - @BindString(R.string.simple_disabled) - String disabledText; + private FragmentAboutCreditsTabBinding binding; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_about_credits_tab, container, false); - ButterKnife.bind(this, v); + binding = FragmentAboutCreditsTabBinding.inflate(inflater, container, false); // VERSIONS - LinkUtil.setHtml(aboutVersion, getString(R.string.about_version, strong("v" + BuildConfig.VERSION_NAME))); + LinkUtil.setHtml(binding.aboutVersion, getString(R.string.about_version, strong("v" + BuildConfig.VERSION_NAME))); SyncManager syncManager = new SyncManager(requireActivity()); try { syncManager.getServerVersion(new IResponseCallback(null) { @Override public void onResponse(Capabilities response) { - requireActivity().runOnUiThread(() -> LinkUtil.setHtml(aboutServerAppVersion, strong("v" + response.getDeckVersion().toString()))); + requireActivity().runOnUiThread(() -> LinkUtil.setHtml(binding.aboutServerAppVersion, strong("v" + response.getDeckVersion().toString()))); } }); } catch (OfflineException e) { - aboutServerAppVersion.setText(disabled(offlineText)); + binding.aboutServerAppVersion.setText(disabled(getString(R.string.you_are_currently_offline))); } + String backgroundSyncOffValue = getString(R.string.pref_value_background_sync_off); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext().getApplicationContext()); - String settingsBackgroundSync = sharedPreferences.getString(sharedPreferencesBackgroundSync, backgroundSyncOffValue); - long lastBackgroundSync = sharedPreferences.getLong(sharedPreferencesLastBackgroundSync, BACKGROUND_SYNC_NEVER_EXECUTED); + String settingsBackgroundSync = sharedPreferences.getString(getString(R.string.pref_key_background_sync), backgroundSyncOffValue); + long lastBackgroundSync = sharedPreferences.getLong(getString(R.string.shared_preference_last_background_sync), BACKGROUND_SYNC_NEVER_EXECUTED); // BACKGROUND SYNC - lastBackgroundSyncExecutionTime.setText( + binding.lastBackgroundSync.setText( lastBackgroundSync == BACKGROUND_SYNC_NEVER_EXECUTED || settingsBackgroundSync.equals(backgroundSyncOffValue) - ? disabled(disabledText) + ? disabled(getString(R.string.simple_disabled)) : strong(DateUtil.getRelativeDateTimeString(getContext(), lastBackgroundSync)) ); - LinkUtil.setHtml(aboutMaintainer, LinkUtil.concatenateResources(v.getResources(), + LinkUtil.setHtml(binding.aboutMaintainer, LinkUtil.concatenateResources(getResources(), R.string.anchor_start, R.string.url_maintainer, R.string.anchor_middle, R.string.about_maintainer, R.string.anchor_end)); - LinkUtil.setHtml(aboutTranslators, - v.getResources().getString(R.string.about_translators_transifex, LinkUtil.concatenateResources(v.getResources(), + LinkUtil.setHtml(binding.aboutTranslators, + getString(R.string.about_translators_transifex, LinkUtil.concatenateResources(getResources(), R.string.anchor_start, R.string.url_translations, R.string.anchor_middle, R.string.about_translators_transifex_label, R.string.anchor_end ))); - return v; + return binding.getRoot(); } private SpannableString strong(CharSequence text) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentLicenseTab.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentLicenseTab.java index 3ab1ea2b1..c313073e3 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentLicenseTab.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentLicenseTab.java @@ -7,43 +7,30 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.FragmentAboutLicenseTabBinding; import it.niedermann.nextcloud.deck.util.LinkUtil; public class AboutFragmentLicenseTab extends Fragment { - @BindView(R.id.about_icons_disclaimer) - TextView iconsDisclaimer; - @BindView(R.id.about_app_license_button) - Button appLicenseButton; + FragmentAboutLicenseTabBinding binding; - @BindString(R.string.paragraph_start) - String paragraphStart; - @BindString(R.string.paragraph_end) - String paragraphEnd; - - @OnClick(R.id.about_app_license_button) - void openLicense() { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_license)))); - } + private String paragraphStart; + private String paragraphEnd; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_about_license_tab, container, false); - ButterKnife.bind(this, v); + binding = FragmentAboutLicenseTabBinding.inflate(inflater, container, false); Resources resources = getResources(); - LinkUtil.setHtml(iconsDisclaimer, paragraphStart, resources.getString(R.string.about_icons_disclaimer, getAppIconHint(resources), getMdiLink(resources)), paragraphEnd); - return v; + paragraphStart = getString(R.string.paragraph_start); + paragraphEnd = getString(R.string.paragraph_end); + binding.aboutAppLicenseButton.setOnClickListener((v) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_license))))); + LinkUtil.setHtml(binding.aboutIconsDisclaimer, paragraphStart, getString(R.string.about_icons_disclaimer, getAppIconHint(resources), getMdiLink(resources)), paragraphEnd); + return binding.getRoot(); } private String getAppIconHint(Resources resources) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlAdapter.java index 9c98a5d10..b851fa853 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlAdapter.java @@ -1,17 +1,11 @@ package it.niedermann.nextcloud.deck.ui.board; import android.content.Context; -import android.graphics.drawable.Drawable; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.widget.AppCompatImageButton; -import androidx.appcompat.widget.SwitchCompat; import androidx.recyclerview.widget.RecyclerView; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; @@ -20,10 +14,9 @@ import com.nextcloud.android.sso.helper.SingleAccountHelper; import java.util.List; -import butterknife.BindDrawable; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemAccessControlBinding; +import it.niedermann.nextcloud.deck.databinding.ItemAccessControlOwnerBinding; import it.niedermann.nextcloud.deck.model.AccessControl; import it.niedermann.nextcloud.deck.model.enums.DBStatus; import it.niedermann.nextcloud.deck.util.ViewUtil; @@ -51,11 +44,11 @@ public class AccessControlAdapter extends RecyclerView.Adapter accessControlChangedListener.deleteAccessControl(ac)); + acHolder.binding.delete.setOnClickListener((v) -> accessControlChangedListener.deleteAccessControl(ac)); - acHolder.switchEdit.setChecked(ac.isPermissionEdit()); - acHolder.switchEdit.setOnCheckedChangeListener((buttonView, isChecked) -> { + acHolder.binding.permissionEdit.setChecked(ac.isPermissionEdit()); + acHolder.binding.permissionEdit.setOnCheckedChangeListener((buttonView, isChecked) -> { ac.setPermissionEdit(isChecked); accessControlChangedListener.updateAccessControl(ac); }); - acHolder.switchManage.setChecked(ac.isPermissionManage()); - acHolder.switchManage.setOnCheckedChangeListener((buttonView, isChecked) -> { + acHolder.binding.permissionManage.setChecked(ac.isPermissionManage()); + acHolder.binding.permissionManage.setOnCheckedChangeListener((buttonView, isChecked) -> { ac.setPermissionManage(isChecked); accessControlChangedListener.updateAccessControl(ac); - acHolder.username.setCompoundDrawables(null, null, null, null); + acHolder.binding.username.setCompoundDrawables(null, null, null, null); }); - acHolder.switchShare.setChecked(ac.isPermissionShare()); - acHolder.switchShare.setOnCheckedChangeListener((buttonView, isChecked) -> { + acHolder.binding.permissionShare.setChecked(ac.isPermissionShare()); + acHolder.binding.permissionShare.setOnCheckedChangeListener((buttonView, isChecked) -> { ac.setPermissionShare(isChecked); accessControlChangedListener.updateAccessControl(ac); }); @@ -122,36 +115,22 @@ public class AccessControlAdapter extends RecyclerView.Adapter { syncManager.getAccessControlByLocalBoardId(accountId, boardId).observe(this, (List accessControlList) -> { AccessControl ownerControl = new AccessControl(); ownerControl.setUser(fullBoard.getOwner()); accessControlList.add(0, ownerControl); RecyclerView.Adapter adapter = new AccessControlAdapter(accessControlList, this, getContext()); - peopleList.setAdapter(adapter); - userAutoCompleteAdapter = new UserAutoCompleteAdapter(this, activity, accountId, boardId); - people.setAdapter(userAutoCompleteAdapter); - people.setOnItemClickListener(this); + binding.peopleList.setAdapter(adapter); + userAutoCompleteAdapter = new UserAutoCompleteAdapter(this, requireActivity(), accountId, boardId); + binding.people.setAdapter(userAutoCompleteAdapter); + binding.people.setOnItemClickListener(this); }); }); } - this.view = view; - return dialogBuilder - .setView(view) + .setView(binding.getRoot()) .setPositiveButton(R.string.simple_close, null) .create(); } @@ -118,6 +106,6 @@ public class AccessControlDialogFragment extends DialogFragment implements ac.setUserId(userAutoCompleteAdapter.getItem(position).getLocalId()); ac.setUser(userAutoCompleteAdapter.getItem(position)); syncManager.createAccessControl(accountId, ac); - people.setText(""); + binding.people.setText(""); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java index 986ce9237..575d33e64 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java @@ -9,10 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Board; @@ -39,7 +36,7 @@ public class BoardAdapter extends ArrayAdapter { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_board, parent, false); } TextView boardName = convertView.findViewById(R.id.boardName); - if(board != null) { + if (board != null) { boardName.setText(board.getTitle()); boardName.setCompoundDrawables(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, "#" + board.getColor()), null, null, null); } else { @@ -53,14 +50,4 @@ public class BoardAdapter extends ArrayAdapter { return getView(position, convertView, parent); } - static class BoardViewHolder extends RecyclerView.ViewHolder { - @BindView(R.id.boardName) - TextView boardName; - - private BoardViewHolder(View view) { - super(view); - ButterKnife.bind(this, view); - } - } - } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java index f529ced63..d12389d21 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java @@ -1,11 +1,8 @@ package it.niedermann.nextcloud.deck.ui.board; -import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Bundle; -import android.view.View; -import android.widget.EditText; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -13,17 +10,16 @@ import androidx.fragment.app.DialogFragment; import java.util.Objects; -import butterknife.BindColor; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.DialogBoardCreateBinding; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.ui.helper.colorchooser.ColorChooser; public class EditBoardDialogFragment extends DialogFragment { + private DialogBoardCreateBinding binding; + private static final String KEY_ACCOUNT_ID = "account_id"; private static final String KEY_BOARD_ID = "board_id"; private static final Long NO_BOARD_ID = -1L; @@ -32,14 +28,6 @@ public class EditBoardDialogFragment extends DialogFragment { private FullBoard fullBoard = null; - @BindView(R.id.input) - EditText boardTitle; - @BindView(R.id.colorChooser) - ColorChooser colorChooser; - - @BindColor(R.color.board_default_color) - int boardDefaultColor; - /** * Use newInstance()-Method */ @@ -60,37 +48,36 @@ public class EditBoardDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Activity activity = requireActivity(); - View view = activity.getLayoutInflater().inflate(R.layout.dialog_board_create, null); - ButterKnife.bind(this, view); + binding = DialogBoardCreateBinding.inflate(getLayoutInflater()); + Long boardId = Objects.requireNonNull(getArguments()).getLong(KEY_BOARD_ID); - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert); + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(requireContext(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert); if (NO_BOARD_ID.equals(boardId)) { dialogBuilder.setTitle(R.string.add_board); - dialogBuilder.setPositiveButton(R.string.simple_add, (dialog, which) -> editBoardListener.onCreateBoard(boardTitle.getText().toString(), colorChooser.getSelectedColor())); - this.colorChooser.selectColor(String.format("#%06X", 0xFFFFFF & boardDefaultColor)); + dialogBuilder.setPositiveButton(R.string.simple_add, (dialog, which) -> editBoardListener.onCreateBoard(binding.input.getText().toString(), binding.colorChooser.getSelectedColor())); + binding.colorChooser.selectColor(String.format("#%06X", 0xFFFFFF & getResources().getColor(R.color.board_default_color))); } else { dialogBuilder.setTitle(R.string.edit_board); dialogBuilder.setPositiveButton(R.string.simple_save, (dialog, which) -> { - this.fullBoard.board.setColor(colorChooser.getSelectedColor().substring(1)); - this.fullBoard.board.setTitle(this.boardTitle.getText().toString()); + this.fullBoard.board.setColor(binding.colorChooser.getSelectedColor().substring(1)); + this.fullBoard.board.setTitle(binding.input.getText().toString()); editBoardListener.onUpdateBoard(fullBoard); }); - new SyncManager(activity).getFullBoardById(Objects.requireNonNull(getArguments()).getLong(KEY_ACCOUNT_ID), boardId).observe(EditBoardDialogFragment.this, (FullBoard fb) -> { + new SyncManager(requireActivity()).getFullBoardById(Objects.requireNonNull(getArguments()).getLong(KEY_ACCOUNT_ID), boardId).observe(EditBoardDialogFragment.this, (FullBoard fb) -> { if (fb.board != null) { this.fullBoard = fb; String title = this.fullBoard.getBoard().getTitle(); - this.boardTitle.setText(title); - this.boardTitle.setSelection(title.length()); - this.colorChooser.selectColor("#" + fullBoard.getBoard().getColor()); + binding.input.setText(title); + binding.input.setSelection(title.length()); + binding.colorChooser.selectColor("#" + fullBoard.getBoard().getColor()); } }); } return dialogBuilder - .setView(view) + .setView(binding.getRoot()) .setNegativeButton(android.R.string.cancel, null) .create(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/ActivityAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/ActivityAdapter.java index 16bc1a9c8..96b05577b 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/ActivityAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/ActivityAdapter.java @@ -2,19 +2,15 @@ package it.niedermann.nextcloud.deck.ui.card; import android.content.Context; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemActivityBinding; import it.niedermann.nextcloud.deck.model.enums.ActivityType; import it.niedermann.nextcloud.deck.model.ocs.Activity; import it.niedermann.nextcloud.deck.util.DateUtil; @@ -34,26 +30,26 @@ public class ActivityAdapter extends RecyclerView.Adapter { + holder.setNotSyncedYetStatus(attachment.getStatusEnum() == DBStatus.UP_TO_DATE); + holder.getRootView().setOnCreateContextMenuListener((menu, v, menuInfo) -> { ((Activity) context).getMenuInflater().inflate(R.menu.attachment_menu, menu); menu.findItem(R.id.delete).setOnMenuItemClickListener(item -> { new DeleteDialogBuilder(context) @@ -109,13 +108,13 @@ public class AttachmentAdapter extends RecyclerView.Adapter AttachmentDialogFragment.newInstance(uri, attachment.getBasename()).show(((AppCompatActivity) context).getSupportFragmentManager(), "preview")); + .into(holder.getPreview()); + holder.getPreview().setImageResource(R.drawable.ic_image_grey600_24dp); + holder.getPreview().getRootView().setOnClickListener((v) -> AttachmentDialogFragment.newInstance(uri, attachment.getBasename()).show(((AppCompatActivity) context).getSupportFragmentManager(), "preview")); } else if (attachment.getMimetype().startsWith("audio")) { - holder.preview.setImageResource(R.drawable.ic_music_note_grey600_24dp); + holder.getPreview().setImageResource(R.drawable.ic_music_note_grey600_24dp); } else if (attachment.getMimetype().startsWith("video")) { - holder.preview.setImageResource(R.drawable.ic_local_movies_grey600_24dp); + holder.getPreview().setImageResource(R.drawable.ic_local_movies_grey600_24dp); } } @@ -127,21 +126,21 @@ public class AttachmentAdapter extends RecyclerView.Adapter { + defaultHolder.binding.filename.getRootView().setOnClickListener((event) -> { Intent openURL = new Intent(android.content.Intent.ACTION_VIEW); openURL.setData(Uri.parse(account.getUrl() + "/index.php/apps/deck/cards/" + cardRemoteId + "/attachment/" + attachment.getId())); context.startActivity(openURL); }); - defaultHolder.filename.setText(attachment.getBasename()); - defaultHolder.filesize.setText(Formatter.formatFileSize(context, attachment.getFilesize())); + defaultHolder.binding.filename.setText(attachment.getBasename()); + defaultHolder.binding.filesize.setText(Formatter.formatFileSize(context, attachment.getFilesize())); if (attachment.getLastModifiedLocal() != null) { - defaultHolder.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModifiedLocal().getTime())); - defaultHolder.modified.setVisibility(View.VISIBLE); + defaultHolder.binding.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModifiedLocal().getTime())); + defaultHolder.binding.modified.setVisibility(View.VISIBLE); } else if (attachment.getLastModified() != null) { - defaultHolder.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModified().getTime())); - defaultHolder.modified.setVisibility(View.VISIBLE); + defaultHolder.binding.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModified().getTime())); + defaultHolder.binding.modified.setVisibility(View.VISIBLE); } else { - defaultHolder.modified.setVisibility(View.GONE); + defaultHolder.binding.modified.setVisibility(View.GONE); } break; } @@ -159,36 +158,63 @@ public class AttachmentAdapter extends RecyclerView.Adapter() { @@ -63,12 +54,12 @@ public class AttachmentDialogFragment extends DialogFragment { // } // }) .load(requireArguments().getString(BUNDLE_KEY_URL)) - .into(image); - image.setContentDescription(requireArguments().getString(BUNDLE_KEY_ALT)); - image.getRootView().setOnClickListener((v) -> dismiss()); + .into(binding.image); + binding.image.setContentDescription(requireArguments().getString(BUNDLE_KEY_ALT)); + binding.image.getRootView().setOnClickListener((v) -> dismiss()); return new AlertDialog.Builder(requireActivity(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert) - .setView(view) + .setView(binding.getRoot()) .create(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardActivityFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardActivityFragment.java index 9b1412be9..c2bcad532 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardActivityFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardActivityFragment.java @@ -7,22 +7,13 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; -import java.util.Objects; - -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.Unbinder; -import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.FragmentCardEditTabActivitiesBinding; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.ui.helper.emptycontentview.EmptyContentView; import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_ACCOUNT_ID; import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_BOARD_ID; @@ -30,18 +21,9 @@ import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_CAN_ED import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ID; public class CardActivityFragment extends Fragment { - private Unbinder unbinder; - - @BindString(R.string.simple_comment) - String addComment; - @BindView(R.id.coordinatorLayout) - CoordinatorLayout coordinatorLayout; - @BindView(R.id.fab) - FloatingActionButton fab; - @BindView(R.id.activity_list) - RecyclerView activitiesList; - @BindView(R.id.no_activities) - EmptyContentView emptyContentView; + + + private FragmentCardEditTabActivitiesBinding binding; public CardActivityFragment() { } @@ -71,9 +53,7 @@ public class CardActivityFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_card_edit_tab_activities, container, false); - unbinder = ButterKnife.bind(this, view); + binding = FragmentCardEditTabActivitiesBinding.inflate(inflater, container, false); Bundle args = getArguments(); if (args != null) { @@ -82,44 +62,38 @@ public class CardActivityFragment extends Fragment { boolean canEdit = args.getBoolean(BUNDLE_KEY_CAN_EDIT); SyncManager syncManager = new SyncManager(requireActivity()); - syncManager.getCardByLocalId(accountId, localId).observe(CardActivityFragment.this, (fullCard) -> { - syncManager.syncActivitiesForCard(fullCard.getCard()).observe(CardActivityFragment.this, (activities -> { + syncManager.getCardByLocalId(accountId, localId).observe(getViewLifecycleOwner(), (fullCard) -> { + syncManager.syncActivitiesForCard(fullCard.getCard()).observe(getViewLifecycleOwner(), (activities -> { if (activities == null || activities.size() == 0) { - emptyContentView.setVisibility(View.VISIBLE); - activitiesList.setVisibility(View.GONE); + binding.emptyContentView.setVisibility(View.VISIBLE); + binding.activitiesList.setVisibility(View.GONE); } else { - emptyContentView.setVisibility(View.GONE); - activitiesList.setVisibility(View.VISIBLE); + binding.emptyContentView.setVisibility(View.GONE); + binding.activitiesList.setVisibility(View.VISIBLE); RecyclerView.Adapter adapter = new ActivityAdapter(activities); - activitiesList.setAdapter(adapter); + binding.activitiesList.setAdapter(adapter); } })); }); if (canEdit) { - fab.setOnClickListener(v -> { - Snackbar.make(coordinatorLayout, "Adding comments is not yet implemented", Snackbar.LENGTH_LONG).show(); + binding.fab.setOnClickListener(v -> { + Snackbar.make(binding.coordinatorLayout, "Adding comments is not yet implemented", Snackbar.LENGTH_LONG).show(); // CommentDialogFragment.newInstance().show(getActivity().getSupportFragmentManager(), addComment); }); - activitiesList.addOnScrollListener(new RecyclerView.OnScrollListener() { + binding.activitiesList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { if (dy > 0) - fab.hide(); + binding.fab.hide(); else if (dy < 0) - fab.show(); + binding.fab.show(); } }); } else { - emptyContentView.hideDescription(); - fab.hide(); + binding.emptyContentView.hideDescription(); + binding.fab.hide(); } } - return view; - } - - @Override - public void onDestroy() { - super.onDestroy(); - unbinder.unbind(); + return binding.getRoot(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentsFragment.java index 563b8ce2c..a8a126b67 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentsFragment.java @@ -14,23 +14,16 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - import java.io.File; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.Unbinder; -import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.FragmentCardEditTabAttachmentsBinding; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Attachment; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.ui.helper.emptycontentview.EmptyContentView; import it.niedermann.nextcloud.deck.util.FileUtils; import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_ACCOUNT_ID; @@ -39,9 +32,10 @@ import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_CAN_ED import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ID; public class CardAttachmentsFragment extends Fragment implements AttachmentAdapter.AttachmentDeletedListener { - private Unbinder unbinder; private static final String TAG = CardAttachmentsFragment.class.getCanonicalName(); + private FragmentCardEditTabAttachmentsBinding binding; + private static final int REQUEST_CODE_ADD_ATTACHMENT = 1; private static final int REQUEST_PERMISSION = 2; @@ -50,22 +44,12 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentAdapt private long accountId; private long cardId; - @BindView(R.id.coordinatorLayout) - CoordinatorLayout coordinatorLayout; - @BindView(R.id.fab) - FloatingActionButton fab; - @BindView(R.id.attachments_list) - RecyclerView attachmentsList; - @BindView(R.id.no_attachments) - EmptyContentView emptyContentView; - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_card_edit_tab_attachments, container, false); - unbinder = ButterKnife.bind(this, view); + binding = FragmentCardEditTabAttachmentsBinding.inflate(inflater, container, false); Bundle args = getArguments(); if (args != null) { @@ -76,14 +60,14 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentAdapt syncManager = new SyncManager(requireActivity()); syncManager.getCardByLocalId(accountId, cardId).observe(getViewLifecycleOwner(), (fullCard) -> { if (fullCard.getAttachments().size() == 0) { - this.emptyContentView.setVisibility(View.VISIBLE); - this.attachmentsList.setVisibility(View.GONE); + this.binding.emptyContentView.setVisibility(View.VISIBLE); + this.binding.attachmentsList.setVisibility(View.GONE); } else { - this.emptyContentView.setVisibility(View.GONE); - this.attachmentsList.setVisibility(View.VISIBLE); + this.binding.emptyContentView.setVisibility(View.GONE); + this.binding.attachmentsList.setVisibility(View.VISIBLE); syncManager.readAccount(accountId).observe(getViewLifecycleOwner(), (Account account) -> { RecyclerView.Adapter adapter = new AttachmentAdapter(this, account, fullCard.getCard().getId(), fullCard.getAttachments()); - attachmentsList.setAdapter(adapter); + binding.attachmentsList.setAdapter(adapter); GridLayoutManager glm = new GridLayoutManager(getActivity(), 3); glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @@ -99,13 +83,13 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentAdapt } } }); - attachmentsList.setLayoutManager(glm); + binding.attachmentsList.setLayoutManager(glm); }); } }); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && canEdit) { - fab.setOnClickListener(v -> { + binding.fab.setOnClickListener(v -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION); @@ -113,24 +97,24 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentAdapt startFilePickerIntent(); } }); - fab.show(); - attachmentsList.addOnScrollListener(new RecyclerView.OnScrollListener() { + binding.fab.show(); + binding.attachmentsList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { if (dy > 0) - fab.hide(); + binding.fab.hide(); else if (dy < 0) - fab.show(); + binding.fab.show(); } }); } else { - fab.hide(); - emptyContentView.hideDescription(); + binding.fab.hide(); + binding.emptyContentView.hideDescription(); } } - return view; + return binding.getRoot(); } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @@ -185,12 +169,6 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentAdapt return fragment; } - @Override - public void onDestroy() { - super.onDestroy(); - unbinder.unbind(); - } - @Override public void onAttachmentDeleted(Attachment attachment) { syncManager.deleteAttachmentOfCard(accountId, cardId, attachment.getLocalId()); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java index 65c4c4169..c6f5434f6 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java @@ -17,7 +17,6 @@ import android.view.ViewGroup; import android.widget.DatePicker; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TextView; import android.widget.TimePicker; import androidx.annotation.NonNull; @@ -27,11 +26,9 @@ import androidx.core.graphics.drawable.DrawableCompat; import androidx.fragment.app.Fragment; import com.google.android.material.chip.Chip; -import com.google.android.material.chip.ChipGroup; import com.google.android.material.snackbar.Snackbar; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; -import com.yydcdut.markdown.MarkdownEditText; import com.yydcdut.markdown.MarkdownProcessor; import com.yydcdut.markdown.syntax.edit.EditFactory; @@ -42,18 +39,14 @@ import java.util.Date; import java.util.Locale; import java.util.Objects; -import butterknife.BindDrawable; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.Unbinder; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.FragmentCardEditTabDetailsBinding; import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.ui.widget.DelayedAutoCompleteTextView; import it.niedermann.nextcloud.deck.util.ColorUtil; import it.niedermann.nextcloud.deck.util.DimensionUtil; import it.niedermann.nextcloud.deck.util.MarkDownUtil; @@ -68,8 +61,11 @@ import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.NO_LOCAL_ID; public class CardDetailsFragment extends Fragment implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { + private static final String TAG = CardDetailsFragment.class.getCanonicalName(); + private FragmentCardEditTabDetailsBinding binding; + private boolean canEdit = false; private FullCard fullCard; private SyncManager syncManager; @@ -78,30 +74,9 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On private String baseUrl; private int avatarSize; private LinearLayout.LayoutParams avatarLayoutParams; - private Unbinder unbinder; private CardDetailsListener cardDetailsListener; private Activity activity; - @BindView(R.id.description) - MarkdownEditText description; - @BindView(R.id.people) - DelayedAutoCompleteTextView people; - @BindView(R.id.labels) - DelayedAutoCompleteTextView labels; - @BindView(R.id.peopleList) - LinearLayout peopleList; - @BindView(R.id.dueDateDate) - TextView dueDate; - @BindView(R.id.dueDateTime) - TextView dueDateTime; - @BindView(R.id.clearDueDate) - ImageView clearDueDate; - @BindView(R.id.labelsGroup) - ChipGroup labelsGroup; - - @BindDrawable(R.drawable.ic_close_circle_grey600) - Drawable closeCircleDrawable; - public CardDetailsFragment() { } @@ -137,8 +112,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_card_edit_tab_details, container, false); - unbinder = ButterKnife.bind(this, view); + binding = FragmentCardEditTabDetailsBinding.inflate(inflater, container, false); dateFormat = android.text.format.DateFormat.getDateFormat(activity); Bundle args = getArguments(); @@ -159,7 +133,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } else { observeOnce(syncManager.getCardByLocalId(accountId, localId), CardDetailsFragment.this, (next) -> { fullCard = next; - description.setText(fullCard.getCard().getDescription()); + binding.description.setText(fullCard.getCard().getDescription()); setupView(accountId, boardId, canEdit); }); } @@ -175,7 +149,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On DeckLog.logError(e); } - return view; + return binding.getRoot(); } private void setupView(long accountId, long boardId, boolean canEdit) { @@ -188,15 +162,15 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On private void setupDescription() { if (canEdit) { MarkdownProcessor markdownProcessor = new MarkdownProcessor(requireContext()); - markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(description.getContext()).build()); + markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(binding.description.getContext()).build()); markdownProcessor.factory(EditFactory.create()); - markdownProcessor.live(description); - description.addTextChangedListener(new TextWatcher() { + markdownProcessor.live(binding.description); + binding.description.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (fullCard != null) { - cardDetailsListener.onDescriptionChanged(description.getText().toString()); - fullCard.getCard().setDescription(description.getText().toString()); + cardDetailsListener.onDescriptionChanged(binding.description.getText().toString()); + fullCard.getCard().setDescription(binding.description.getText().toString()); } } @@ -209,7 +183,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } }); } else { - description.setEnabled(false); + binding.description.setEnabled(false); } } @@ -253,18 +227,18 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On private void setupDueDate() { if (this.fullCard.getCard().getDueDate() != null) { - dueDate.setText(dateFormat.format(this.fullCard.getCard().getDueDate())); - dueDateTime.setText(dueTime.format(this.fullCard.getCard().getDueDate())); - clearDueDate.setVisibility(View.VISIBLE); + binding.dueDateDate.setText(dateFormat.format(this.fullCard.getCard().getDueDate())); + binding.dueDateTime.setText(dueTime.format(this.fullCard.getCard().getDueDate())); + binding.clearDueDate.setVisibility(View.VISIBLE); } else { - clearDueDate.setVisibility(View.GONE); - dueDate.setText(null); - dueDateTime.setText(null); + binding.clearDueDate.setVisibility(View.GONE); + binding.dueDateDate.setText(null); + binding.dueDateTime.setText(null); } if (canEdit) { - dueDate.setOnClickListener(v -> { + binding.dueDateDate.setOnClickListener(v -> { if (fullCard != null && fullCard.getCard() != null) { createDatePickerDialogFromDate(activity, this, fullCard.getCard().getDueDate()).show(); } else { @@ -272,7 +246,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } }); - dueDateTime.setOnClickListener(v -> { + binding.dueDateTime.setOnClickListener(v -> { if (fullCard != null && fullCard.getCard() != null) { createTimePickerDialogFromDate(activity, this, fullCard.getCard().getDueDate()).show(); } else { @@ -280,56 +254,56 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } }); - clearDueDate.setOnClickListener(v -> { + binding.clearDueDate.setOnClickListener(v -> { cardDetailsListener.onDueDateChanged(null); - dueDate.setText(null); - dueDateTime.setText(null); + binding.dueDateDate.setText(null); + binding.dueDateTime.setText(null); fullCard.getCard().setDueDate(null); - clearDueDate.setVisibility(View.GONE); + binding.clearDueDate.setVisibility(View.GONE); }); } else { - dueDate.setEnabled(false); - dueDateTime.setEnabled(false); - clearDueDate.setVisibility(View.GONE); + binding.dueDateDate.setEnabled(false); + binding.dueDateTime.setEnabled(false); + binding.clearDueDate.setVisibility(View.GONE); } } private void setupLabels(long accountId, long boardId, boolean canEdit) { - labelsGroup.removeAllViews(); + binding.labelsGroup.removeAllViews(); if (canEdit) { Long localCardId = fullCard.getCard().getLocalId(); localCardId = localCardId == null ? -1 : localCardId; - labels.setAdapter(new LabelAutoCompleteAdapter(this, activity, accountId, boardId, localCardId)); - labels.setOnItemClickListener((adapterView, view, position, id) -> { + binding.labels.setAdapter(new LabelAutoCompleteAdapter(this, activity, accountId, boardId, localCardId)); + binding.labels.setOnItemClickListener((adapterView, view, position, id) -> { Label label = (Label) adapterView.getItemAtPosition(position); if (LabelAutoCompleteAdapter.CREATE_ID == label.getLocalId()) { Label newLabel = new Label(label); - newLabel.setTitle(((LabelAutoCompleteAdapter) labels.getAdapter()).getLastFilterText()); + newLabel.setTitle(((LabelAutoCompleteAdapter) binding.labels.getAdapter()).getLastFilterText()); newLabel.setLocalId(null); observeOnce(syncManager.createLabel(accountId, newLabel, boardId), CardDetailsFragment.this, createdLabel -> { newLabel.setLocalId(createdLabel.getLocalId()); cardDetailsListener.onLabelAdded(createdLabel); - labelsGroup.addView(createChipFromLabel(newLabel)); - labelsGroup.setVisibility(View.VISIBLE); + binding.labelsGroup.addView(createChipFromLabel(newLabel)); + binding.labelsGroup.setVisibility(View.VISIBLE); }); } else { cardDetailsListener.onLabelAdded(label); - labelsGroup.addView(createChipFromLabel(label)); - labelsGroup.setVisibility(View.VISIBLE); + binding.labelsGroup.addView(createChipFromLabel(label)); + binding.labelsGroup.setVisibility(View.VISIBLE); } - labels.setText(""); + binding.labels.setText(""); }); } else { - labels.setEnabled(false); + binding.labels.setEnabled(false); } if (fullCard.getLabels() != null && fullCard.getLabels().size() > 0) { for (Label label : fullCard.getLabels()) { - labelsGroup.addView(createChipFromLabel(label)); + binding.labelsGroup.addView(createChipFromLabel(label)); } - labelsGroup.setVisibility(View.VISIBLE); + binding.labelsGroup.setVisibility(View.VISIBLE); } else { - labelsGroup.setVisibility(View.INVISIBLE); + binding.labelsGroup.setVisibility(View.INVISIBLE); } } @@ -338,10 +312,10 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On Chip chip = new Chip(activity); chip.setText(label.getTitle()); if (canEdit) { - chip.setCloseIcon(closeCircleDrawable); + chip.setCloseIcon(getResources().getDrawable(R.drawable.ic_close_circle_grey600)); chip.setCloseIconVisible(true); chip.setOnCloseIconClickListener(v -> { - labelsGroup.removeView(chip); + binding.labelsGroup.removeView(chip); cardDetailsListener.onLabelRemoved(label); }); } @@ -366,18 +340,18 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On if (canEdit) { Long localCardId = fullCard.getCard().getLocalId(); localCardId = localCardId == null ? -1 : localCardId; - people.setAdapter(new UserAutoCompleteAdapter(this, activity, accountId, boardId, localCardId)); - people.setOnItemClickListener((adapterView, view, position, id) -> { + binding.people.setAdapter(new UserAutoCompleteAdapter(this, activity, accountId, boardId, localCardId)); + binding.people.setOnItemClickListener((adapterView, view, position, id) -> { User user = (User) adapterView.getItemAtPosition(position); cardDetailsListener.onUserAdded(user); if (baseUrl != null) { addAvatar(baseUrl, user); } - people.setText(""); + binding.people.setText(""); }); if (this.fullCard.getAssignedUsers() != null) { - peopleList.removeAllViews(); + binding.peopleList.removeAllViews(); if (baseUrl != null) { for (User user : this.fullCard.getAssignedUsers()) { addAvatar(baseUrl, user); @@ -385,7 +359,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } } } else { - people.setEnabled(false); + binding.people.setEnabled(false); } } @@ -395,7 +369,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On if (canEdit) { avatar.setOnClickListener(v -> { cardDetailsListener.onUserRemoved(user); - peopleList.removeView(avatar); + binding.peopleList.removeView(avatar); Snackbar.make( Objects.requireNonNull(getView()), getString(R.string.unassigned_user, user.getDisplayname()), Snackbar.LENGTH_LONG) @@ -405,24 +379,18 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On }).show(); }); } - peopleList.addView(avatar); + binding.peopleList.addView(avatar); avatar.requestLayout(); ViewUtil.addAvatar(getContext(), avatar, baseUrl, user.getUid(), avatarSize, R.drawable.ic_person_grey600_24dp); } - @Override - public void onDestroy() { - super.onDestroy(); - unbinder.unbind(); - } - @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { Calendar c = Calendar.getInstance(); int hourOfDay; int minute; - if (dueDateTime.getText() != null && dueDateTime.length() > 0) { + if (binding.dueDateTime.getText() != null && binding.dueDateTime.length() > 0) { hourOfDay = this.fullCard.getCard().getDueDate().getHours(); minute = this.fullCard.getCard().getDueDate().getMinutes(); } else { @@ -432,13 +400,13 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On c.set(year, month, dayOfMonth, hourOfDay, minute); this.fullCard.getCard().setDueDate(c.getTime()); - dueDate.setText(dateFormat.format(c.getTime())); + binding.dueDateDate.setText(dateFormat.format(c.getTime())); cardDetailsListener.onDueDateChanged(fullCard.card.getDueDate()); if (this.fullCard.getCard().getDueDate() == null || this.fullCard.getCard().getDueDate().getTime() == 0) { - clearDueDate.setVisibility(View.GONE); + binding.clearDueDate.setVisibility(View.GONE); } else { - clearDueDate.setVisibility(View.VISIBLE); + binding.clearDueDate.setVisibility(View.VISIBLE); } } @@ -449,12 +417,12 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On } this.fullCard.getCard().getDueDate().setHours(hourOfDay); this.fullCard.getCard().getDueDate().setMinutes(minute); - dueDateTime.setText(dueTime.format(this.fullCard.getCard().getDueDate().getTime())); + binding.dueDateTime.setText(dueTime.format(this.fullCard.getCard().getDueDate().getTime())); cardDetailsListener.onDueDateChanged(fullCard.card.getDueDate()); if (this.fullCard.getCard().getDueDate() == null || this.fullCard.getCard().getDueDate().getTime() == 0) { - clearDueDate.setVisibility(View.GONE); + binding.clearDueDate.setVisibility(View.GONE); } else { - clearDueDate.setVisibility(View.VISIBLE); + binding.clearDueDate.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardTabAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardTabAdapter.java index db57f5652..a55660622 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardTabAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardTabAdapter.java @@ -1,33 +1,25 @@ package it.niedermann.nextcloud.deck.ui.card; -import android.app.Activity; +import android.content.Context; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; -import butterknife.BindString; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; public class CardTabAdapter extends FragmentStatePagerAdapter { + private Context context; private long accountId; private long localId; private long boardId; private boolean canEdit; - @BindString(R.string.card_edit_details) - String details; - @BindString(R.string.card_edit_attachments) - String attachments; - @BindString(R.string.card_edit_activity) - String activity; - - public CardTabAdapter(FragmentManager fm, Activity activity, long accountId, long localId, long boardId, boolean canEdit) { + public CardTabAdapter(@NonNull FragmentManager fm, @NonNull Context context, long accountId, long localId, long boardId, boolean canEdit) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); - ButterKnife.bind(this, activity); + this.context = context; this.accountId = accountId; this.localId = localId; this.boardId = boardId; @@ -54,11 +46,11 @@ public class CardTabAdapter extends FragmentStatePagerAdapter { public CharSequence getPageTitle(int position) { switch (position) { case 0: - return details; + return context.getString(R.string.card_edit_details); case 1: - return attachments; + return context.getString(R.string.card_edit_attachments); case 2: - return activity; + return context.getString(R.string.card_edit_activity); default: throw new IllegalArgumentException("position " + position + "is not available"); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CommentDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CommentDialogFragment.java index f67863a84..84947a526 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CommentDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CommentDialogFragment.java @@ -7,7 +7,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -16,16 +15,14 @@ import androidx.fragment.app.DialogFragment; import java.util.Objects; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.DialogAddCommentBinding; public class CommentDialogFragment extends DialogFragment { private AddCommentListener addCommentListener; - @BindView(R.id.input) - EditText input; + private DialogAddCommentBinding binding; /** * Use newInstance()-Method @@ -46,23 +43,22 @@ public class CommentDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_add_comment, null); - ButterKnife.bind(this, view); + binding = DialogAddCommentBinding.inflate(getLayoutInflater()); - return new AlertDialog.Builder(getActivity(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert) - .setView(view) + return new AlertDialog.Builder(requireActivity(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert) + .setView(binding.getRoot()) .setTitle(R.string.simple_comment) .setNegativeButton(android.R.string.cancel, (dialog, which) -> { // Do something else }) - .setPositiveButton(R.string.simple_add, (dialog, which) -> addCommentListener.onCommentAdded(input.getText().toString())) + .setPositiveButton(R.string.simple_add, (dialog, which) -> addCommentListener.onCommentAdded(binding.input.getText().toString())) .create(); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - input.requestFocus(); + binding.input.requestFocus(); Objects.requireNonNull(Objects.requireNonNull(getDialog()).getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); return super.onCreateView(inflater, container, savedInstanceState); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java index 88bde96dc..8e02b02e9 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java @@ -8,8 +8,6 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -20,12 +18,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import butterknife.BindColor; -import butterknife.BindInt; -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemAutocompleteDropdownBinding; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.util.ViewUtil; @@ -43,15 +37,7 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable private String lastFilterText; private boolean canManage = false; - @BindInt(R.integer.max_labels_suggested) - int maxLabelsSuggested; - @BindString(R.string.label_add) - String createLabelText; - @BindColor(R.color.grey600) - int createLabelColor; - LabelAutoCompleteAdapter(@NonNull LifecycleOwner owner, Activity activity, long accountId, long boardId, long cardId) { - ButterKnife.bind(this, activity); this.owner = owner; this.context = activity; this.accountId = accountId; @@ -64,7 +50,7 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable createLabel.setLocalId(CREATE_ID); createLabel.setBoardId(boardId); createLabel.setAccountId(accountId); - createLabel.setColor(Integer.toHexString(createLabelColor)); + createLabel.setColor(Integer.toHexString(context.getResources().getColor(R.color.grey600))); canManage = true; } }); @@ -93,8 +79,9 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable } else { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.item_autocomplete_dropdown, parent, false); - holder = new ViewHolder(convertView); + ItemAutocompleteDropdownBinding binding = ItemAutocompleteDropdownBinding.inflate(inflater, parent, false); + holder = new ViewHolder(binding); + convertView = binding.getRoot(); convertView.setTag(holder); } @@ -103,10 +90,10 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable iconResource = R.drawable.ic_plus; } - holder.icon.setImageDrawable( + holder.binding.icon.setImageDrawable( ViewUtil.getTintedImageView(context, iconResource,"#" + getItem(position).getColor() )); - holder.label.setText(getItem(position).getTitle()); + holder.binding.label.setText(getItem(position).getTitle()); return convertView; } @@ -122,11 +109,11 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable Objects.requireNonNull(((Fragment) owner).getActivity()).runOnUiThread(() -> { LiveData> liveData = constraint.toString().trim().length() > 0 ? syncManager.searchNotYetAssignedLabelsByTitle(accountId, boardId, cardId, constraint.toString()) - : syncManager.findProposalsForLabelsToAssign(accountId, boardId, cardId, maxLabelsSuggested); + : syncManager.findProposalsForLabelsToAssign(accountId, boardId, cardId, context.getResources().getInteger(R.integer.max_labels_suggested)); liveData.observe(owner, (labels -> { final boolean constraintLengthGreaterZero = constraint.toString().trim().length() > 0; if (canManage && constraintLengthGreaterZero) { - createLabel.setTitle(String.format(createLabelText, constraint)); + createLabel.setTitle(String.format(context.getString(R.string.label_add), constraint)); } if (labels != null) { if (canManage && constraintLengthGreaterZero) { @@ -168,13 +155,10 @@ public class LabelAutoCompleteAdapter extends BaseAdapter implements Filterable } static class ViewHolder { - @BindView(R.id.icon) - ImageView icon; - @BindView(R.id.label) - TextView label; + ItemAutocompleteDropdownBinding binding; - ViewHolder(View view) { - ButterKnife.bind(this, view); + ViewHolder(ItemAutocompleteDropdownBinding binding) { + this.binding = binding; } } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/UserAutoCompleteAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/UserAutoCompleteAdapter.java index 570080250..78e5202d0 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/UserAutoCompleteAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/UserAutoCompleteAdapter.java @@ -8,8 +8,6 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -25,11 +23,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import butterknife.BindInt; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemAutocompleteDropdownBinding; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.util.ViewUtil; @@ -37,7 +33,7 @@ import it.niedermann.nextcloud.deck.util.ViewUtil; import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce; public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { - private Context activity; + private Context context; private List userList = new ArrayList<>(); private SyncManager syncManager; private long accountId; @@ -45,17 +41,13 @@ public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { private long cardId; private LifecycleOwner owner; - @BindInt(R.integer.max_users_suggested) - int maxUsersSuggested; - public UserAutoCompleteAdapter(@NonNull LifecycleOwner owner, Activity activity, long accountId, long boardId) { this(owner, activity, accountId, boardId, 0L); } UserAutoCompleteAdapter(@NonNull LifecycleOwner owner, Activity activity, long accountId, long boardId, long cardId) { - ButterKnife.bind(this, activity); this.owner = owner; - this.activity = activity; + this.context = activity; this.accountId = accountId; this.boardId = boardId; this.cardId = cardId; @@ -83,18 +75,19 @@ public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { if (convertView != null) { holder = (ViewHolder) convertView.getTag(); } else { - LayoutInflater inflater = (LayoutInflater) activity + LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.item_autocomplete_dropdown, parent, false); - holder = new ViewHolder(convertView); + ItemAutocompleteDropdownBinding binding = ItemAutocompleteDropdownBinding.inflate(inflater, parent, false); + holder = new ViewHolder(binding); + convertView = binding.getRoot(); convertView.setTag(holder); } try { - SingleSignOnAccount account = SingleAccountHelper.getCurrentSingleSignOnAccount(activity); + SingleSignOnAccount account = SingleAccountHelper.getCurrentSingleSignOnAccount(context); ViewUtil.addAvatar( - activity, - holder.icon, + context, + holder.binding.icon, account.url, getItem(position).getUid(), R.drawable.ic_person_grey600_24dp @@ -105,7 +98,7 @@ public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { DeckLog.logError(e); } - holder.label.setText(getItem(position).getDisplayname()); + holder.binding.label.setText(getItem(position).getDisplayname()); return convertView; } @@ -122,11 +115,11 @@ public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { if (cardId == 0L) { liveData = constraint.toString().trim().length() > 0 ? syncManager.searchUserByUidOrDisplayNameForACL(accountId, boardId, constraint.toString()) - : syncManager.findProposalsForUsersToAssignForACL(accountId, boardId, maxUsersSuggested); + : syncManager.findProposalsForUsersToAssignForACL(accountId, boardId, context.getResources().getInteger(R.integer.max_users_suggested)); } else { liveData = constraint.toString().trim().length() > 0 ? syncManager.searchUserByUidOrDisplayName(accountId, cardId, constraint.toString()) - : syncManager.findProposalsForUsersToAssign(accountId, boardId, cardId, maxUsersSuggested); + : syncManager.findProposalsForUsersToAssign(accountId, boardId, cardId, context.getResources().getInteger(R.integer.max_users_suggested)); } observeOnce(liveData, owner, users -> { if (users != null) { @@ -158,13 +151,10 @@ public class UserAutoCompleteAdapter extends BaseAdapter implements Filterable { } static class ViewHolder { - @BindView(R.id.icon) - ImageView icon; - @BindView(R.id.label) - TextView label; + ItemAutocompleteDropdownBinding binding; - ViewHolder(View view) { - ButterKnife.bind(this, view); + ViewHolder(ItemAutocompleteDropdownBinding binding) { + this.binding = binding; } } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java index 367e7ab34..d7c1fba7e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java @@ -5,12 +5,10 @@ import android.content.ClipboardManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import com.nextcloud.android.sso.helper.VersionCheckHelper; @@ -18,41 +16,29 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Objects; -import butterknife.BindString; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ActivityExceptionBinding; public class ExceptionActivity extends AppCompatActivity { - Throwable throwable; - - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.message) - TextView message; - @BindView(R.id.stacktrace) - TextView stacktrace; - @BindString(R.string.error) - String title; - @BindString(R.string.simple_exception) - String exception; - @BindString(R.string.copied_to_clipboard) - String copiedToClipboard; + private ActivityExceptionBinding binding; public static final String KEY_THROWABLE = "T"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { - setContentView(R.layout.activity_exception); - ButterKnife.bind(this); + binding = ActivityExceptionBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); super.onCreate(savedInstanceState); - throwable = ((Throwable) getIntent().getSerializableExtra(KEY_THROWABLE)); + + binding.copy.setOnClickListener((v) -> copyStacktraceToClipboard()); + binding.close.setOnClickListener((v) -> finish()); + + Throwable throwable = ((Throwable) getIntent().getSerializableExtra(KEY_THROWABLE)); throwable.printStackTrace(); - setSupportActionBar(toolbar); - Objects.requireNonNull(getSupportActionBar()).setTitle(title); - this.message.setText(throwable.getMessage()); + setSupportActionBar(binding.toolbar); + Objects.requireNonNull(getSupportActionBar()).setTitle(R.string.error); + binding.message.setText(throwable.getMessage()); String debugInfo = ""; @@ -77,11 +63,11 @@ public class ExceptionActivity extends AppCompatActivity { debugInfo += "\nOS Version: " + System.getProperty("os.version") + "(" + android.os.Build.VERSION.INCREMENTAL + ")"; debugInfo += "\nOS API Level: " + android.os.Build.VERSION.SDK_INT; debugInfo += "\nDevice: " + android.os.Build.DEVICE; - debugInfo += "\nModel (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")"; + debugInfo += "\nModel (and Product): " + android.os.Build.MODEL + " (" + android.os.Build.PRODUCT + ")"; debugInfo += "\n\n---"; - this.stacktrace.setText(debugInfo + "\n\n" + getStacktraceOf(throwable)); + binding.stacktrace.setText(debugInfo + "\n\n" + getStacktraceOf(throwable)); } private String getStacktraceOf(Throwable e) { @@ -90,17 +76,10 @@ public class ExceptionActivity extends AppCompatActivity { return sw.toString(); } - - @OnClick(R.id.copy) void copyStacktraceToClipboard() { final android.content.ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clipData = ClipData.newPlainText(getString(R.string.simple_exception), "```\n" + this.stacktrace.getText() + "\n```"); + ClipData clipData = ClipData.newPlainText(getString(R.string.simple_exception), "```\n" + binding.stacktrace.getText() + "\n```"); clipboardManager.setPrimaryClip(clipData); - Toast.makeText(this, copiedToClipboard, Toast.LENGTH_SHORT).show(); - } - - @OnClick(R.id.close) - void close() { - finish(); + Toast.makeText(this, R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/colorchooser/ColorChooser.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/colorchooser/ColorChooser.java index b83b70ed9..df977efe3 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/colorchooser/ColorChooser.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/colorchooser/ColorChooser.java @@ -10,15 +10,13 @@ import android.widget.LinearLayout; import androidx.annotation.Nullable; -import com.google.android.flexbox.FlexboxLayout; import com.skydoves.colorpickerview.ColorEnvelope; import com.skydoves.colorpickerview.ColorPickerView; import com.skydoves.colorpickerview.listeners.ColorEnvelopeListener; import com.skydoves.colorpickerview.sliders.BrightnessSlideBar; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.WidgetColorChooserBinding; import it.niedermann.nextcloud.deck.util.ViewUtil; public class ColorChooser extends LinearLayout { @@ -26,8 +24,7 @@ public class ColorChooser extends LinearLayout { private Context context; private String[] colors; - @BindView(R.id.colorPicker) - FlexboxLayout colorPicker; + WidgetColorChooserBinding binding; private String selectedColor; private String previouslySelectedColor; @@ -47,10 +44,9 @@ public class ColorChooser extends LinearLayout { colors = getResources().getStringArray(a.getResourceId(R.styleable.ColorChooser_colors, 0)); a.recycle(); - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.widget_color_chooser, this, true); - ButterKnife.bind(this); + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + binding = WidgetColorChooserBinding.inflate(inflater, this, true); initDefaultColors(); customColorPicker = (ColorPickerView) findViewById(R.id.customColorPicker); @@ -61,12 +57,12 @@ public class ColorChooser extends LinearLayout { customColorPicker.setColorListener(new ColorEnvelopeListener() { @Override public void onColorSelected(ColorEnvelope envelope, boolean fromUser) { - String customColor = "#" + envelope.getHexCode().substring(2); + String customColor = "#" + envelope.getHexCode().substring(2); selectedColor = customColor; previouslySelectedColor = customColor; //previouslySelectedColor = customColor; customColorChooser.setImageDrawable(ViewUtil.getTintedImageView(context, R.drawable.circle_alpha_colorize_36dp, selectedColor)); - } + } }); } @@ -83,7 +79,7 @@ public class ColorChooser extends LinearLayout { this.previouslySelectedImageView = image; }); image.setImageDrawable(ViewUtil.getTintedImageView(this.context, R.drawable.circle_grey600_36dp, color)); - colorPicker.addView(image); + binding.colorPicker.addView(image); } } @@ -96,12 +92,12 @@ public class ColorChooser extends LinearLayout { } else { customColorChooser.setImageDrawable(ViewUtil.getTintedImageView(this.context, R.drawable.circle_alpha_colorize_36dp, this.selectedColor)); } - colorPicker.addView(customColorChooser); + binding.colorPicker.addView(customColorChooser); customColorChooser.setOnClickListener((View imageView) -> { // when clicked sets the custom color wheel to be visible customColorPicker.setVisibility(View.VISIBLE); brightnessSlideBar.setVisibility(View.VISIBLE); - }); + }); } public void selectColor(String newColor) { @@ -109,7 +105,7 @@ public class ColorChooser extends LinearLayout { for (int i = 0; i < colors.length; i++) { if (colors[i].equals(newColor)) { initCustomColorChooser(); // adds custom color picker, with default color - colorPicker.getChildAt(i).performClick(); + binding.colorPicker.getChildAt(i).performClick(); return; } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/dnd/CrossTabDragAndDrop.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/dnd/CrossTabDragAndDrop.java index f35edaed3..3c5af634d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/dnd/CrossTabDragAndDrop.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/helper/dnd/CrossTabDragAndDrop.java @@ -17,8 +17,6 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import butterknife.BindInt; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.full.FullCard; @@ -38,25 +36,15 @@ public class CrossTabDragAndDrop { private long lastSwap = 0; private long lastMove = 0; - @BindInt(R.integer.drag_n_drop_dp_to_react) - int dragAndDropDPtoReact; - @BindInt(R.integer.drag_n_drop_dp_to_react_top_bottom) - int dragAndDropDPtoReactTopBottom; - @BindInt(R.integer.drag_n_drop_ms_to_react) - int msToReact; - @BindInt(R.integer.drag_n_drop_dp_to_react_top_bottom) - int msToReactOnMove; - private final float pxToReactTopBottom; private final Set moveListenerList = new HashSet<>(1); public CrossTabDragAndDrop(Activity activity) { this.activity = activity; - ButterKnife.bind(this, activity); final float density = activity.getResources().getDisplayMetrics().density; - this.pxToReact = dragAndDropDPtoReact * density; - this.pxToReactTopBottom = dragAndDropDPtoReactTopBottom * density; + this.pxToReact = activity.getResources().getInteger(R.integer.drag_n_drop_dp_to_react) * density; + this.pxToReactTopBottom = activity.getResources().getInteger(R.integer.drag_n_drop_dp_to_react_top_bottom) * density; } public void register(final ViewPager viewPager, TabLayout stackLayout) { @@ -78,7 +66,7 @@ public class CrossTabDragAndDrop { activity.getWindowManager().getDefaultDisplay().getSize(size); long now = System.currentTimeMillis(); - if (lastSwap + msToReact < now) { // don't change Tabs so fast! + if (lastSwap + activity.getResources().getInteger(R.integer.drag_n_drop_ms_to_react) < now) { // don't change Tabs so fast! int oldTabPosition = viewPager.getCurrentItem(); boolean shouldSwitchTab = true; @@ -111,7 +99,7 @@ public class CrossTabDragAndDrop { } - if (lastMove + msToReactOnMove < now){ + if (lastMove + activity.getResources().getInteger(R.integer.drag_n_drop_dp_to_react_top_bottom) < now) { //push around the other cards View viewUnder = currentRecyclerView.findChildViewUnder(dragEvent.getX(), dragEvent.getY()); @@ -182,10 +170,10 @@ public class CrossTabDragAndDrop { } private void detectAndKillDuplicatesInNeighbourTab(ViewPager viewPager, FullCard cardToFind, int oldTabPosition, int newTabPosition) { - int tabPositionToCheck = newTabPosition > oldTabPosition ? newTabPosition+1 : newTabPosition-1; + int tabPositionToCheck = newTabPosition > oldTabPosition ? newTabPosition + 1 : newTabPosition - 1; if (isMovePossible(viewPager, tabPositionToCheck)) { - viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){ + viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); @@ -203,7 +191,7 @@ public class CrossTabDragAndDrop { List cardList = cardAdapter.getCardList(); for (int i = 0; i < cardList.size(); i++) { FullCard c = cardList.get(i); - if (cardToFind.getCard().getLocalId().equals(c.getLocalId())){ + if (cardToFind.getCard().getLocalId().equals(c.getLocalId())) { cardAdapter.removeItem(i); cardAdapter.notifyItemRemoved(i); // DeckLog.log("dnd removed dupe at tab "+tabPositionToCheck+": "+c.getCard().getTitle()); @@ -231,11 +219,11 @@ public class CrossTabDragAndDrop { } } - public void addCardMovedByDragListener(CardMovedByDragListener listener){ + public void addCardMovedByDragListener(CardMovedByDragListener listener) { moveListenerList.add(listener); } - public void removeCardMovedByDragListener(CardMovedByDragListener listener){ + public void removeCardMovedByDragListener(CardMovedByDragListener listener) { moveListenerList.remove(listener); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java index 17d5be87e..8ed58f04a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java @@ -9,8 +9,6 @@ import android.preference.SwitchPreference; import androidx.annotation.Nullable; -import butterknife.BindString; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; @@ -18,29 +16,20 @@ import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; public class SettingsFragment extends PreferenceFragment { - @BindString(R.string.pref_key_wifi_only) - String prefKeyWifiOnly; - @BindString(R.string.pref_key_dark_theme) - String prefKeyDarkTheme; - @BindString(R.string.pref_key_background_sync) - String prefKeyBackgroundSync; - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ButterKnife.bind(this, getActivity()); - addPreferencesFromResource(R.xml.settings); - final SwitchPreference wifiOnlyPref = (SwitchPreference) findPreference(prefKeyWifiOnly); + final SwitchPreference wifiOnlyPref = (SwitchPreference) findPreference(getString(R.string.pref_key_wifi_only)); wifiOnlyPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { Boolean syncOnWifiOnly = (Boolean) newValue; DeckLog.log("syncOnWifiOnly: " + syncOnWifiOnly); return true; }); - final SwitchPreference themePref = (SwitchPreference) findPreference(prefKeyDarkTheme); + final SwitchPreference themePref = (SwitchPreference) findPreference(getString(R.string.pref_key_dark_theme)); themePref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { Boolean darkTheme = (Boolean) newValue; DeckLog.log("darkTheme: " + darkTheme); @@ -50,7 +39,7 @@ public class SettingsFragment extends PreferenceFragment { return true; }); - final ListPreference backgroundSyncPref = (ListPreference) findPreference(prefKeyBackgroundSync); + final ListPreference backgroundSyncPref = (ListPreference) findPreference(getString(R.string.pref_key_background_sync)); backgroundSyncPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { SyncWorker.update(getActivity().getApplicationContext(), (String) newValue); return true; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/EditStackDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/EditStackDialogFragment.java index 908137005..d43f225ef 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/EditStackDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/EditStackDialogFragment.java @@ -7,7 +7,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -16,10 +15,9 @@ import androidx.fragment.app.DialogFragment; import java.util.Objects; -import butterknife.BindView; -import butterknife.ButterKnife; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.DialogStackCreateBinding; public class EditStackDialogFragment extends DialogFragment { public static final Long NO_STACK_ID = -1L; @@ -28,8 +26,7 @@ public class EditStackDialogFragment extends DialogFragment { private long stackId = NO_STACK_ID; private EditStackListener editStackListener; - @BindView(R.id.input) - EditText input; + private DialogStackCreateBinding binding; /** * Use newInstance()-Method @@ -50,11 +47,10 @@ public class EditStackDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_stack_create, null); - ButterKnife.bind(this, view); + binding = DialogStackCreateBinding.inflate(getLayoutInflater()); - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert) - .setView(view) + AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity(), Application.getAppTheme(getContext()) ? R.style.DialogDarkTheme : R.style.ThemeOverlay_AppCompat_Dialog_Alert) + .setView(binding.getRoot()) .setNegativeButton(android.R.string.cancel, (dialog, which) -> { // Do something else }); @@ -64,11 +60,11 @@ public class EditStackDialogFragment extends DialogFragment { stackId = getArguments().getLong(KEY_STACK_ID); if (stackId == NO_STACK_ID) { builder.setTitle(R.string.add_column) - .setPositiveButton(R.string.simple_add, (dialog, which) -> editStackListener.onCreateStack(input.getText().toString())); + .setPositiveButton(R.string.simple_add, (dialog, which) -> editStackListener.onCreateStack(binding.input.getText().toString())); } else { - input.setText(getArguments().getString(KEY_OLD_TITLE)); + binding.input.setText(getArguments().getString(KEY_OLD_TITLE)); builder.setTitle(R.string.rename_column) - .setPositiveButton(R.string.simple_rename, (dialog, which) -> editStackListener.onUpdateStack(stackId, input.getText().toString())); + .setPositiveButton(R.string.simple_rename, (dialog, which) -> editStackListener.onUpdateStack(stackId, binding.input.getText().toString())); } return builder.create(); } @@ -76,7 +72,7 @@ public class EditStackDialogFragment extends DialogFragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - input.requestFocus(); + binding.input.requestFocus(); Objects.requireNonNull(Objects.requireNonNull(getDialog()).getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); return super.onCreateView(inflater, container, savedInstanceState); } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 16606c116..206010840 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -19,7 +19,7 @@ tools:title="@string/about" /> diff --git a/app/src/main/res/layout/fragment_card_edit_tab_activities.xml b/app/src/main/res/layout/fragment_card_edit_tab_activities.xml index d6fba28ff..2fe7bed0b 100644 --- a/app/src/main/res/layout/fragment_card_edit_tab_activities.xml +++ b/app/src/main/res/layout/fragment_card_edit_tab_activities.xml @@ -8,7 +8,7 @@ tools:context=".ui.EditActivity">