diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d62b05e9..58453e85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,9 @@ android:theme="@style/AppTheme" android:usesCleartextTraffic="true" tools:ignore="GoogleAppIndexingWarning"> + diff --git a/app/src/main/java/com/readrops/app/activities/AccountSettingsActivity.java b/app/src/main/java/com/readrops/app/activities/AccountSettingsActivity.java new file mode 100644 index 00000000..8e37d8c0 --- /dev/null +++ b/app/src/main/java/com/readrops/app/activities/AccountSettingsActivity.java @@ -0,0 +1,59 @@ +package com.readrops.app.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import com.readrops.app.R; +import com.readrops.app.database.entities.Account; +import com.readrops.app.databinding.ActivityAccountSettingsBinding; + +public class AccountSettingsActivity extends AppCompatActivity { + + public static final String ACCOUNT = "ACCOUNT"; + + private ActivityAccountSettingsBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = DataBindingUtil.setContentView(this, R.layout.activity_account_settings); + Account account = getIntent().getParcelableExtra(ACCOUNT); + + binding.accountSettingsFeeds.setOnClickListener(v -> { + Intent intent = new Intent(getApplication(), ManageFeedsActivity.class); + intent.putExtra(ManageFeedsActivity.ACCOUNT, account); + startActivity(intent); + }); + + binding.accountSettingsAccount.setOnClickListener(v -> { + if (account.getAccountType() != Account.AccountType.LOCAL) { + Intent intent = new Intent(getApplication(), AddAccountActivity.class); + intent.putExtra(AddAccountActivity.EDIT_ACCOUNT, account); + startActivity(intent); + } + + }); + } + + @Override + public void onBackPressed() { + finish(); + super.onBackPressed(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/readrops/app/activities/AddAccountActivity.java b/app/src/main/java/com/readrops/app/activities/AddAccountActivity.java index 24554798..2da5e195 100644 --- a/app/src/main/java/com/readrops/app/activities/AddAccountActivity.java +++ b/app/src/main/java/com/readrops/app/activities/AddAccountActivity.java @@ -16,6 +16,7 @@ import com.readrops.app.databinding.ActivityAddAccountBinding; import com.readrops.app.utils.SharedPreferencesManager; import com.readrops.app.viewmodels.AccountViewModel; +import io.reactivex.CompletableObserver; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -23,11 +24,15 @@ import io.reactivex.schedulers.Schedulers; public class AddAccountActivity extends AppCompatActivity { + public static final String EDIT_ACCOUNT = "EDIT_ACCOUNT"; + private ActivityAddAccountBinding binding; private AccountViewModel viewModel; private Account.AccountType accountType; - private boolean forwardResult; + private boolean forwardResult, editAccount; + + private Account accountToEdit; @Override protected void onCreate(Bundle savedInstanceState) { @@ -41,17 +46,17 @@ public class AddAccountActivity extends AppCompatActivity { int flag = getIntent().getFlags(); forwardResult = flag == Intent.FLAG_ACTIVITY_FORWARD_RESULT; - binding.providerImage.setImageResource(accountType.getIconRes()); - binding.providerName.setText(accountType.getName()); + accountToEdit = getIntent().getParcelableExtra(EDIT_ACCOUNT); - binding.addAccountSkip.setOnClickListener(v -> { - Intent intent = new Intent(getApplicationContext(), MainActivity.class); - startActivity(intent); + if (accountToEdit != null) { + editAccount = true; + fillFields(); + } else { + binding.providerImage.setImageResource(accountType.getIconRes()); + binding.providerName.setText(accountType.getName()); - finish(); - }); - - binding.addAccountName.setText(accountType.getName()); + binding.addAccountName.setText(accountType.getName()); + } } public void createAccount(View view) { @@ -61,55 +66,87 @@ public class AddAccountActivity extends AppCompatActivity { String login = binding.addAccountLogin.getText().toString().trim(); String password = binding.addAccountPassword.getText().toString().trim(); - Account account = new Account(url, name, accountType); - account.setLogin(login); - account.setPassword(password); - viewModel.login(account) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new SingleObserver() { + if (editAccount) { + accountToEdit.setUrl(url); + accountToEdit.setAccountName(name); + accountToEdit.setLogin(login); + accountToEdit.setPassword(password); - @Override - public void onSubscribe(Disposable d) { - binding.addAccountLoading.setVisibility(View.VISIBLE); - binding.addAccountValidate.setEnabled(false); - } - - @Override - public void onSuccess(Boolean success) { - binding.addAccountLoading.setVisibility(View.GONE); - - if (success) { - saveLoginPassword(account); - - if (forwardResult) { - Intent intent = new Intent(); - intent.putExtra(MainActivity.ACCOUNT_KEY, account); - setResult(RESULT_OK, intent); - finish(); - - } else { - Intent intent = new Intent(getApplicationContext(), MainActivity.class); - intent.putExtra(MainActivity.ACCOUNT_KEY, account); - startActivity(intent); - } - - finish(); - } else { - binding.addAccountValidate.setEnabled(true); - Toast.makeText(AddAccountActivity.this, "Impossible to login", - Toast.LENGTH_LONG).show(); + viewModel.update(accountToEdit) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new CompletableObserver() { + @Override + public void onSubscribe(Disposable d) { + binding.addAccountLoading.setVisibility(View.VISIBLE); + binding.addAccountValidate.setEnabled(false); } - } - @Override - public void onError(Throwable e) { - binding.addAccountLoading.setVisibility(View.GONE); - binding.addAccountValidate.setEnabled(true); - Toast.makeText(AddAccountActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); - } - }); + @Override + public void onComplete() { + finish(); + } + + @Override + public void onError(Throwable e) { + binding.addAccountLoading.setVisibility(View.GONE); + binding.addAccountValidate.setEnabled(true); + Toast.makeText(AddAccountActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); + } + }); + } else { + Account account = new Account(url, name, accountType); + account.setLogin(login); + account.setPassword(password); + + viewModel.login(account) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + + @Override + public void onSubscribe(Disposable d) { + binding.addAccountLoading.setVisibility(View.VISIBLE); + binding.addAccountValidate.setEnabled(false); + } + + @Override + public void onSuccess(Boolean success) { + binding.addAccountLoading.setVisibility(View.GONE); + + if (success) { + saveLoginPassword(account); + + if (forwardResult) { + Intent intent = new Intent(); + intent.putExtra(MainActivity.ACCOUNT_KEY, account); + setResult(RESULT_OK, intent); + finish(); + + } else { + Intent intent = new Intent(getApplicationContext(), MainActivity.class); + intent.putExtra(MainActivity.ACCOUNT_KEY, account); + startActivity(intent); + } + + finish(); + } else { + binding.addAccountValidate.setEnabled(true); + Toast.makeText(AddAccountActivity.this, "Impossible to login", + Toast.LENGTH_LONG).show(); + } + } + + @Override + public void onError(Throwable e) { + binding.addAccountLoading.setVisibility(View.GONE); + binding.addAccountValidate.setEnabled(true); + Toast.makeText(AddAccountActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); + } + }); + } + } } @@ -149,4 +186,14 @@ public class AddAccountActivity extends AppCompatActivity { account.setLogin(null); account.setPassword(null); } + + private void fillFields() { + binding.providerImage.setImageResource(accountToEdit.getAccountType().getIconRes()); + binding.providerName.setText(accountToEdit.getAccountType().getName()); + + binding.addAccountUrl.setText(accountToEdit.getUrl()); + binding.addAccountName.setText(accountToEdit.getAccountName()); + binding.addAccountLogin.setText(SharedPreferencesManager.readString(this, accountToEdit.getLoginKey())); + binding.addAccountPassword.setText(SharedPreferencesManager.readString(this, accountToEdit.getPasswordKey())); + } } diff --git a/app/src/main/java/com/readrops/app/activities/MainActivity.java b/app/src/main/java/com/readrops/app/activities/MainActivity.java index 2e226fb3..93c73995 100644 --- a/app/src/main/java/com/readrops/app/activities/MainActivity.java +++ b/app/src/main/java/com/readrops/app/activities/MainActivity.java @@ -31,7 +31,6 @@ import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader; import com.bumptech.glide.util.ViewPreloadSizeProvider; -import com.github.clans.fab.FloatingActionMenu; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; @@ -74,7 +73,6 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou private Toolbar toolbar; private Drawer drawer; - private FloatingActionMenu actionMenu; private PagedList allItems; @@ -110,8 +108,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou syncProgressLayout = findViewById(R.id.sync_progress_layout); syncProgress = findViewById(R.id.sync_progress_text_view); syncProgressBar = findViewById(R.id.sync_progress_bar); - - actionMenu = findViewById(R.id.fab_menu); + syncProgressBar = findViewById(R.id.sync_progress_bar); feedCount = 0; initRecyclerView(); @@ -158,6 +155,10 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou } break; } + } else { + Intent intent = new Intent(this, AccountSettingsActivity.class); + intent.putExtra(AccountSettingsActivity.ACCOUNT, viewModel.getCurrentAccount()); + startActivity(intent); } return true; @@ -465,19 +466,10 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou } public void openAddFeedActivity(View view) { - actionMenu.close(true); - Intent intent = new Intent(this, AddFeedActivity.class); startActivityForResult(intent, ADD_FEED_REQUEST); } - public void addFolder(View view) { - actionMenu.close(true); - - Intent intent = new Intent(this, ManageFeedsActivity.class); - startActivityForResult(intent, MANAGE_FEEDS_REQUEST); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == ADD_FEED_REQUEST && resultCode == RESULT_OK) { diff --git a/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java b/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java index 39f851c3..1ec93d95 100644 --- a/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java +++ b/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java @@ -11,13 +11,14 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentTransaction; -import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.readrops.app.R; +import com.readrops.app.database.entities.Account; import com.readrops.app.database.entities.Folder; import com.readrops.app.database.pojo.FeedWithFolder; import com.readrops.app.viewmodels.ManageFeedsViewModel; @@ -30,18 +31,27 @@ import io.reactivex.schedulers.Schedulers; public class ManageFeedsActivity extends AppCompatActivity { + public static final String ACCOUNT = "ACCOUNT"; + private RecyclerView recyclerView; private FeedsAdapter adapter; private ManageFeedsViewModel viewModel; + private Account account; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_manage_feeds); + account = getIntent().getParcelableExtra(ACCOUNT); + + viewModel = ViewModelProviders.of(this).get(ManageFeedsViewModel.class); + viewModel.setAccount(account); + recyclerView = findViewById(R.id.feeds_recyclerview); - recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new FeedsAdapter(new FeedsAdapter.ManageFeedsListener() { @Override @@ -88,10 +98,7 @@ public class ManageFeedsActivity extends AppCompatActivity { }).attachToRecyclerView(recyclerView); - viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(ManageFeedsViewModel.class); - viewModel.getFeedsWithFolder().observe(this, feedWithFolders -> { - adapter.submitList(feedWithFolders); - }); + viewModel.getFeedsWithFolder().observe(this, feedWithFolders -> adapter.submitList(feedWithFolders)); } private void deleteFolder(int feedId, int position) { diff --git a/app/src/main/java/com/readrops/app/database/dao/AccountDao.java b/app/src/main/java/com/readrops/app/database/dao/AccountDao.java index a3827916..0e814f1a 100644 --- a/app/src/main/java/com/readrops/app/database/dao/AccountDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/AccountDao.java @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData; import androidx.room.Dao; import androidx.room.Insert; import androidx.room.Query; +import androidx.room.Update; import com.readrops.app.database.entities.Account; @@ -24,6 +25,9 @@ public interface AccountDao { @Insert long insert(Account account); + @Update + void update(Account account); + @Query("Update Account set last_modified = :lastModified Where id = :accountId") void updateLastModified(int accountId, long lastModified); diff --git a/app/src/main/java/com/readrops/app/database/dao/FeedDao.java b/app/src/main/java/com/readrops/app/database/dao/FeedDao.java index 40c7ac0a..daafaf4e 100644 --- a/app/src/main/java/com/readrops/app/database/dao/FeedDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/FeedDao.java @@ -61,8 +61,8 @@ public interface FeedDao { @Query("Select Feed.name as feed_name, Feed.id as feed_id, Folder.name as folder_name, Folder.id as folder_id," + "Feed.description as feed_description, Feed.icon_url as feed_icon_url, Feed.url as feed_url, Feed.folder_id as feed_folder_id" + - ", Feed.siteUrl as feed_siteUrl from Feed Left Join Folder on Feed.folder_id = Folder.id Order by Feed.name") - LiveData> getAllFeedsWithFolder(); + ", Feed.siteUrl as feed_siteUrl from Feed Left Join Folder on Feed.folder_id = Folder.id Where Feed.account_id = :accountId Order by Feed.name") + LiveData> getAllFeedsWithFolder(int accountId); @Query("Select * From Feed Where id in (:ids)") List selectFromIdList(long[] ids); diff --git a/app/src/main/java/com/readrops/app/database/dao/FolderDao.java b/app/src/main/java/com/readrops/app/database/dao/FolderDao.java index 8dbd0987..d0dc1d9a 100644 --- a/app/src/main/java/com/readrops/app/database/dao/FolderDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/FolderDao.java @@ -13,8 +13,8 @@ import java.util.List; @Dao public interface FolderDao { - @Query("Select * from Folder Order By name ASC") - LiveData> getAllFolders(); + @Query("Select * from Folder Where account_id = :accountId Order By name ASC") + LiveData> getAllFolders(int accountId); @Query("Select * from Folder Where account_id = :accountId Order By name ASC") List getFolders(int accountId); diff --git a/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java index 7cfa7de3..a13d611a 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java @@ -10,6 +10,7 @@ import com.readrops.app.database.entities.Account; import com.readrops.app.repositories.ARepository; import com.readrops.app.repositories.NextNewsRepository; +import io.reactivex.Completable; import io.reactivex.Single; public class AccountViewModel extends AndroidViewModel { @@ -36,6 +37,13 @@ public class AccountViewModel extends AndroidViewModel { } + public Completable update(Account account) { + return Completable.create(emitter -> { + database.accountDao().update(account); + emitter.onComplete(); + }); + } + public Single getAccountCountByAccountType(int accountTypeCode) { return Single.create(emitter -> emitter.onSuccess(database.accountDao().getAccountCountByType(accountTypeCode))); } diff --git a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsViewModel.java index f51edb4a..3eb2a021 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsViewModel.java @@ -6,9 +6,12 @@ import androidx.lifecycle.LiveData; import androidx.annotation.NonNull; import com.readrops.app.database.Database; +import com.readrops.app.database.entities.Account; import com.readrops.app.database.entities.Folder; import com.readrops.app.database.pojo.FeedWithFolder; +import com.readrops.app.repositories.ARepository; import com.readrops.app.repositories.LocalFeedRepository; +import com.readrops.app.repositories.NextNewsRepository; import java.util.List; @@ -19,15 +22,28 @@ public class ManageFeedsViewModel extends AndroidViewModel { private Database db; private LiveData> feedsWithFolder; private LiveData> folders; - private LocalFeedRepository repository; + private ARepository repository; + + private Account account; public ManageFeedsViewModel(@NonNull Application application) { super(application); - db = Database.getInstance(application); - repository = new LocalFeedRepository(application); - feedsWithFolder = db.feedDao().getAllFeedsWithFolder(); - folders = db.folderDao().getAllFolders(); + db = Database.getInstance(application); + } + + private void setup() { + switch (account.getAccountType()) { + case LOCAL: + repository = new LocalFeedRepository(getApplication()); + break; + case NEXTCLOUD_NEWS: + repository = new NextNewsRepository(getApplication()); + break; + } + + feedsWithFolder = db.feedDao().getAllFeedsWithFolder(account.getId()); + folders = db.folderDao().getAllFolders(account.getId()); } public LiveData> getFeedsWithFolder() { @@ -38,6 +54,15 @@ public class ManageFeedsViewModel extends AndroidViewModel { repository.updateFeedWithFolder(feedWithFolder); } + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + setup(); + } + public LiveData> getFolders() { return folders; } diff --git a/app/src/main/res/layout/activity_account_settings.xml b/app/src/main/res/layout/activity_account_settings.xml new file mode 100644 index 00000000..28ab7e3c --- /dev/null +++ b/app/src/main/res/layout/activity_account_settings.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_account.xml b/app/src/main/res/layout/activity_add_account.xml index a256ff1e..f31c9c39 100644 --- a/app/src/main/res/layout/activity_add_account.xml +++ b/app/src/main/res/layout/activity_add_account.xml @@ -114,15 +114,6 @@ android:visibility="gone" tools:visibility="visible" /> - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 38985fe6..e3fe56cd 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -108,36 +108,14 @@ - - - - - - - + android:onClick="openAddFeedActivity" + android:src="@drawable/ic_add_white" + android:layout_margin="16dp"/> diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index d3f48f7d..0605810b 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -59,5 +59,7 @@ Aucun flux Choisir un compte Compte local + Flux + Compte \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d95382a..5a6ac66b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,4 +64,6 @@ Local account Freshrss Feedly + Feeds + Account