diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-10-16 18:54:20 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-10-16 18:54:20 +0300 |
commit | fafca46f90b761e7e6e54e4c525a8599acde0136 (patch) | |
tree | c2045392eaee4fab510c8501b91f513f793437b6 | |
parent | 033ae67ef38fe5cdd4bd2a8425f2c57a23f7e068 (diff) |
Introduce LoginActivity
10 files changed, 296 insertions, 58 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ea5992b1..e3a01dbc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,6 +48,10 @@ </activity> <activity + android:name=".ImportAccountActivity" + android:label="@string/add_account" /> + + <activity android:name=".AppendToNoteActivity" android:label="@string/append_to_note"> diff --git a/app/src/main/java/it/niedermann/owncloud/notes/ImportAccountActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/ImportAccountActivity.java new file mode 100644 index 00000000..316f31a6 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/ImportAccountActivity.java @@ -0,0 +1,128 @@ +package it.niedermann.owncloud.notes; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModelProvider; + +import com.nextcloud.android.sso.AccountImporter; +import com.nextcloud.android.sso.exceptions.AccountImportCancelledException; +import com.nextcloud.android.sso.exceptions.AndroidGetAccountsPermissionNotGranted; +import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotInstalledException; +import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.ui.UiExceptionManager; + +import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.databinding.ActivityImportAccountBinding; +import it.niedermann.owncloud.notes.exception.ExceptionDialogFragment; +import it.niedermann.owncloud.notes.exception.ExceptionHandler; +import it.niedermann.owncloud.notes.main.ImportViewModel; +import it.niedermann.owncloud.notes.persistence.CapabilitiesClient; +import it.niedermann.owncloud.notes.persistence.entity.Account; +import it.niedermann.owncloud.notes.shared.model.Capabilities; + +public class ImportAccountActivity extends AppCompatActivity { + + private static final String TAG = ImportAccountActivity.class.getSimpleName(); + public static final int REQUEST_CODE_IMPORT_ACCOUNT = 1; + + private ImportViewModel importViewModel; + private ActivityImportAccountBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler(this)); + + binding = ActivityImportAccountBinding.inflate(getLayoutInflater()); + importViewModel = new ViewModelProvider(this).get(ImportViewModel.class); + + setContentView(binding.getRoot()); + + binding.welcomeText.setText(getString(R.string.welcome_text, getString(R.string.app_name))); + binding.addButton.setOnClickListener((v) -> { + binding.addButton.setEnabled(false); + try { + AccountImporter.pickNewAccount(this); + } catch (NextcloudFilesAppNotInstalledException e) { + UiExceptionManager.showDialogForException(this, e); + Log.w(TAG, "============================================================="); + Log.w(TAG, "Nextcloud app is not installed. Cannot choose account"); + e.printStackTrace(); + } catch (AndroidGetAccountsPermissionNotGranted e) { + binding.addButton.setEnabled(true); + AccountImporter.requestAndroidAccountPermissionsAndPickAccount(this); + } + }); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + Drawable wrapDrawable = DrawableCompat.wrap(binding.progressCircular.getIndeterminateDrawable()); + DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(this, R.color.defaultBrand)); + binding.progressCircular.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable)); + } + } + + @Override + public boolean onSupportNavigateUp() { + super.onSupportNavigateUp(); + setResult(RESULT_CANCELED); + return true; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + try { + AccountImporter.onActivityResult(requestCode, resultCode, data, ImportAccountActivity.this, ssoAccount -> { + runOnUiThread(() -> binding.progressCircular.setVisibility(View.VISIBLE)); + + SingleAccountHelper.setCurrentAccount(getApplicationContext(), ssoAccount.name); + new Thread(() -> { + Log.i(TAG, "Added account: " + "name:" + ssoAccount.name + ", " + ssoAccount.url + ", userId" + ssoAccount.userId); + try { + Log.i(TAG, "Loading capabilities for " + ssoAccount.name); + final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null); + LiveData<Account> createLiveData = importViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities); + runOnUiThread(() -> createLiveData.observe(this, (account) -> { + if (account != null) { + Log.i(TAG, capabilities.toString()); + BrandingUtil.saveBrandColors(this, capabilities.getColor(), capabilities.getTextColor()); + setResult(RESULT_OK); + finish(); + } else { + binding.addButton.setEnabled(true); + ExceptionDialogFragment.newInstance(new IllegalStateException("Created account is null.")).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + } + })); + } catch (Throwable e) { + e.printStackTrace(); + runOnUiThread(() -> { + binding.addButton.setEnabled(true); + ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + }); + } + }).start(); + }); + } catch (AccountImportCancelledException e) { + runOnUiThread(() -> binding.addButton.setEnabled(true)); + Log.i(TAG, "Account import has been canceled."); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + AccountImporter.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + } +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java index 0a23f67a..105eb8f3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java @@ -24,7 +24,6 @@ import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.entity.Account; import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToLayerDrawable; -import static it.niedermann.owncloud.notes.main.MainActivity.manage_account; /** * Displays all available {@link Account} entries and provides basic operations for them, like adding or switching @@ -93,7 +92,7 @@ public class AccountSwitcherDialog extends BrandedDialogFragment { }); binding.manageAccounts.setOnClickListener((v) -> { - requireActivity().startActivityForResult(new Intent(requireContext(), ManageAccountsActivity.class), manage_account); + requireActivity().startActivity(new Intent(requireContext(), ManageAccountsActivity.class)); dismiss(); }); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/ImportViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/ImportViewModel.java new file mode 100644 index 00000000..bc382daa --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/ImportViewModel.java @@ -0,0 +1,74 @@ +package it.niedermann.owncloud.notes.main; + +import android.app.Application; +import android.content.Context; +import android.util.Log; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.core.util.Pair; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.nextcloud.android.sso.AccountImporter; +import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; +import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; +import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.model.SingleSignOnAccount; + +import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.List; + +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; +import it.niedermann.owncloud.notes.main.navigation.NavigationItem; +import it.niedermann.owncloud.notes.persistence.CapabilitiesClient; +import it.niedermann.owncloud.notes.persistence.NoteServerSyncHelper; +import it.niedermann.owncloud.notes.persistence.NotesDatabase; +import it.niedermann.owncloud.notes.persistence.entity.Account; +import it.niedermann.owncloud.notes.persistence.entity.Category; +import it.niedermann.owncloud.notes.persistence.entity.CategoryWithNotesCount; +import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; +import it.niedermann.owncloud.notes.persistence.entity.SingleNoteWidgetData; +import it.niedermann.owncloud.notes.shared.model.Capabilities; +import it.niedermann.owncloud.notes.shared.model.CategorySortingMethod; +import it.niedermann.owncloud.notes.shared.model.ISyncCallback; +import it.niedermann.owncloud.notes.shared.model.Item; +import it.niedermann.owncloud.notes.shared.model.NavigationCategory; + +import static androidx.lifecycle.Transformations.distinctUntilChanged; +import static androidx.lifecycle.Transformations.map; +import static androidx.lifecycle.Transformations.switchMap; +import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_RECENT; +import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_STARRED; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByCategory; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByInitials; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByTime; +import static it.niedermann.owncloud.notes.shared.model.CategorySortingMethod.SORT_MODIFIED_DESC; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED; +import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem; + +public class ImportViewModel extends AndroidViewModel { + + private static final String TAG = ImportViewModel.class.getSimpleName(); + + @NonNull + private final NotesDatabase db; + + public ImportViewModel(@NonNull Application application) { + super(application); + this.db = NotesDatabase.getInstance(application.getApplicationContext()); + } + + public LiveData<Account> addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities) { + return db.addAccount(url, username, accountName, capabilities); + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 49f796ef..9bdc3371 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -47,6 +47,7 @@ import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.util.List; +import it.niedermann.owncloud.notes.ImportAccountActivity; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.accountpicker.AccountPickerListener; @@ -107,14 +108,11 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A private final static int create_note_cmd = 0; private final static int show_single_note_cmd = 1; - public final static int manage_account = 4; protected ItemAdapter adapter; private NavigationAdapter adapterCategories; private MenuAdapter menuAdapter; - private boolean notAuthorizedAccountHandled = false; - protected SingleSignOnAccount ssoAccount; protected Account localAccount; @@ -133,12 +131,12 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A super.onCreate(savedInstanceState); mainViewModel = new ViewModelProvider(this).get(MainViewModel.class); - CapabilitiesWorker.update(this); binding = DrawerLayoutBinding.inflate(getLayoutInflater()); activityBinding = ActivityNotesListViewBinding.bind(binding.activityNotesListView.getRoot()); setContentView(binding.getRoot()); + this.coordinatorLayout = binding.activityNotesListView.activityNotesListView; this.swipeRefreshLayout = binding.activityNotesListView.swiperefreshlayout; this.fabCreate = binding.activityNotesListView.fabCreate; @@ -154,6 +152,18 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A setupNavigationList(); setupNotesList(); + mainViewModel.getAccountsCount().observe(this, (count) -> { + if (count == 0) { + startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT); + } else { + try { + mainViewModel.postCurrentAccount(mainViewModel.getLocalAccountByAccountName(SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()).name)); + } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { + ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + } + } + }); + mainViewModel.hasMultipleAccountsConfigured().observe(this, (hasMultipleAccountsConfigured) -> canMoveNoteToAnotherAccounts = hasMultipleAccountsConfigured); mainViewModel.getSyncStatus().observe(this, (syncStatus) -> swipeRefreshLayout.setRefreshing(syncStatus)); mainViewModel.getSyncErrors().observe(this, (exceptions) -> BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG) @@ -245,15 +255,10 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A } } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { Log.i(TAG, "Tried to select account, but got an " + e.getClass().getSimpleName() + ". Asking for importing an account..."); - handleNotAuthorizedAccount(); } fabCreate.show(); activityBinding.launchAccountSwitcher.setOnClickListener((v) -> { - if (localAccount == null) { - handleNotAuthorizedAccount(); - } else { - AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName()); - } + AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName()); }); if (menuAdapter == null) { @@ -275,43 +280,13 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A @Override protected void onResume() { - try { - ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()); - if (localAccount == null || !localAccount.getAccountName().equals(ssoAccount.name)) { - Account account = mainViewModel.getLocalAccountByAccountName(ssoAccount.name); - if (account == null) { - askForNewAccount(this); - } else { - mainViewModel.postCurrentAccount(account); - } - } - } catch (NoCurrentAccountSelectedException | NextcloudFilesAppAccountNotFoundException e) { - if (localAccount == null) { - List<Account> localAccounts = mainViewModel.getAccounts(); - if (localAccounts.size() > 0) { - mainViewModel.postCurrentAccount(localAccount); - } - } - if (!notAuthorizedAccountHandled) { - handleNotAuthorizedAccount(); - } - } - // refresh and sync every time the activity gets - if (localAccount != null) { - if (!mainViewModel.synchronize(ssoAccount)) { - BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG).show(); - } + if (!mainViewModel.synchronize(ssoAccount)) { + BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG).show(); } super.onResume(); } - private void handleNotAuthorizedAccount() { - fabCreate.hide(); - askForNewAccount(this); - notAuthorizedAccountHandled = true; - } - private void setupToolbars() { setSupportActionBar(binding.activityNotesListView.toolbar); activityBinding.homeToolbar.setOnClickListener((v) -> { @@ -320,7 +295,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A } }); - activityBinding.launchAccountSwitcher.setOnClickListener((v) -> askForNewAccount(this)); activityBinding.menuButton.setOnClickListener((v) -> binding.drawerLayout.openDrawer(GravityCompat.START)); final LinearLayout searchEditFrame = activityBinding.searchView.findViewById(R.id.search_edit_frame); @@ -408,7 +382,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A Log.i(TAG, "Clearing Glide disk cache"); Glide.get(getApplicationContext()).clearDiskCache(); }).start(); - Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name); final LiveData<Boolean> syncLiveData = mainViewModel.performFullSynchronizationForCurrentAccount(); final Observer<Boolean> syncObserver = syncSuccess -> { if (!syncSuccess) { @@ -568,13 +541,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A recreate(); break; } - case manage_account: { - if (resultCode == RESULT_FIRST_USER) { - recreate(); // TODO - askForNewAccount(this); - } - break; - } default: { try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> { @@ -589,9 +555,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A Log.i(TAG, capabilities.toString()); runOnUiThread(() -> mainViewModel.postCurrentAccount(mainViewModel.getLocalAccountByAccountName(ssoAccount.name))); })); - } catch (SQLiteException e) { - // Happens when upgrading from version ≤ 1.0.1 and importing the account - runOnUiThread(() -> mainViewModel.postCurrentAccount(mainViewModel.getLocalAccountByAccountName(ssoAccount.name))); } catch (Exception e) { // Happens when importing an already existing account the second time if (e instanceof TokenMismatchException && mainViewModel.getLocalAccountByAccountName(ssoAccount.name) != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index c93e8bdd..47079011 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -358,6 +358,7 @@ public class MainViewModel extends AndroidViewModel { if (currentAccount == null) { return insufficientInformation; } else { + Log.i(TAG, "[performFullSynchronizationForCurrentAccount] Refreshing capabilities for " + currentAccount.getAccountName()); MutableLiveData<Boolean> syncSuccess = new MutableLiveData<>(); new Thread(() -> { try { @@ -448,4 +449,8 @@ public class MainViewModel extends AndroidViewModel { public void createOrUpdateSingleNoteWidgetData(SingleNoteWidgetData data) { db.getWidgetSingleNoteDao().createOrUpdateSingleNoteWidgetData(data); } + + public LiveData<Integer> getAccountsCount() { + return db.getAccountDao().getAccountsCountLiveData(); + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java index 5bcbb4a5..00dd9d0e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java @@ -3,7 +3,6 @@ package it.niedermann.owncloud.notes.manageaccounts; import android.os.Bundle; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.LiveData; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; @@ -50,7 +49,7 @@ public class ManageAccountsActivity extends LockedActivity { SingleAccountHelper.setCurrentAccount(getApplicationContext(), localAccounts.get(0).getAccountName()); adapter.setCurrentLocalAccount(localAccounts.get(0)); } else { - setResult(AppCompatActivity.RESULT_FIRST_USER); + SingleAccountHelper.setCurrentAccount(getApplicationContext(), null); finish(); } deleteLiveData.removeObservers(this); diff --git a/app/src/main/res/layout/activity_import_account.xml b/app/src/main/res/layout/activity_import_account.xml new file mode 100644 index 00000000..4ad83f02 --- /dev/null +++ b/app/src/main/res/layout/activity_import_account.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/scrollView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fillViewport="true"> + + <RelativeLayout + android:id="@+id/relativeLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="@dimen/spacer_2x"> + + <androidx.appcompat.widget.AppCompatImageView + android:id="@+id/image" + android:layout_width="match_parent" + android:layout_height="96dp" + android:layout_above="@+id/welcome_text" + android:layout_gravity="center" + android:layout_marginBottom="32dp" + android:contentDescription="@null" + android:tint="@color/fg_secondary" + app:srcCompat="@drawable/ic_launcher_foreground_full" /> + + <TextView + android:id="@+id/welcome_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:layout_centerVertical="true" + android:layout_marginBottom="48dp" + android:gravity="center_horizontal" + android:textSize="24sp" + tools:text="Welcome to Nextcloud Notes" /> + + <Button + android:id="@+id/add_button" + style="@style/Widget.AppCompat.Button.Colored" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/welcome_text" + android:layout_centerHorizontal="true" + android:paddingStart="32dp" + android:paddingTop="24dp" + android:paddingEnd="32dp" + android:paddingBottom="24dp" + android:text="@string/choose_account" + app:backgroundTint="@color/defaultBrand" /> + + <ProgressBar + android:id="@+id/progress_circular" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/add_button" + android:layout_centerHorizontal="true" + android:layout_marginTop="32dp" + android:indeterminateTint="@color/defaultBrand" + android:visibility="gone" /> + </RelativeLayout> +</ScrollView>
\ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 39559c4c..8efeb927 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -18,6 +18,7 @@ <color name="fg_default_selection">#333333</color> <color name="fg_default_low">#666666</color> <color name="fg_default_high">#cccccc</color> + <color name="fg_secondary">#999999</color> <color name="fg_contrast">#ffffff</color> <color name="icon_color_default">#757575</color> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9c48717a..60a3809d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ <string name="label_all_notes">All notes</string> <string name="label_favorites">Favorites</string> <string name="action_create">New note</string> + <string name="welcome_text">Welcome to %1$s</string> <string name="action_settings">Settings</string> <string name="action_trashbin">Deleted notes</string> <string name="action_search">Search</string> @@ -314,4 +315,5 @@ <string name="error_action_open_deck_info">Open App info</string> <string name="error_action_open_network">Network settings</string> <string name="no_other_accounts">You don\'t have configured any other accounts yet.</string> + <string name="choose_account">Choose account</string> </resources> |