diff --git a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java index 016e1002..8724df32 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java @@ -12,6 +12,7 @@ import org.gitnex.tea4j.models.GiteaVersion; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.databinding.ActivityAddNewAccountBinding; import org.mian.gitnex.helpers.AppUtil; @@ -114,9 +115,7 @@ public class AddNewAccountActivity extends BaseActivity { private void versionCheck(final String instanceUrl, final String loginToken) { Call callVersion; - callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken("token " + loginToken); - callVersion.enqueue(new Callback() { @Override @@ -205,14 +204,15 @@ public class AddNewAccountActivity extends BaseActivity { assert userDetails != null; // insert new account to db if does not exist String accountName = userDetails.getUsername() + "@" + instanceUrl; - UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); - int checkAccount = userAccountsApi.getCount(accountName); + UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); + boolean userAccountExists = userAccountsApi.userAccountExists(accountName); - if(checkAccount == 0) { + if(!userAccountExists) { - userAccountsApi.insertNewAccount(accountName, instanceUrl, userDetails.getUsername(), loginToken, ""); + userAccountsApi.createNewAccount(accountName, instanceUrl, userDetails.getUsername(), loginToken, ""); Toasty.success(ctx, getResources().getString(R.string.accountAddedMessage)); finish(); + } else { diff --git a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java index 42be2a54..8e0a85bd 100644 --- a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java @@ -13,11 +13,13 @@ import org.gitnex.tea4j.models.PullRequests; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityDeeplinksBinding; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.UrlHelper; import java.net.URI; import java.util.List; @@ -65,7 +67,7 @@ public class DeepLinksActivity extends BaseActivity { } // check for the links(URI) to be in the db - UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); + UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); List userAccounts = userAccountsApi.usersAccounts(); for(UserAccount userAccount : userAccounts) { @@ -79,13 +81,9 @@ public class DeepLinksActivity extends BaseActivity { accountFound = true; - tinyDB.putString("loginUid", userAccount.getUserName()); - tinyDB.putString("userLogin", userAccount.getUserName()); - tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken()); - tinyDB.putString("instanceUrl", userAccount.getInstanceUrl()); - tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); - + AppUtil.switchToAccount(ctx, userAccount); break; + } } @@ -112,7 +110,7 @@ public class DeepLinksActivity extends BaseActivity { final String repoName = restOfUrl[restOfUrl.length - 3]; int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); - RepositoriesApi repositoryData = new RepositoriesApi(ctx); + RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); @@ -344,7 +342,7 @@ public class DeepLinksActivity extends BaseActivity { tinyDB.putString("repoFullName", repoOwner + "/" + repoName); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); - RepositoriesApi repositoryData = new RepositoriesApi(ctx); + RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); @@ -415,7 +413,7 @@ public class DeepLinksActivity extends BaseActivity { tinyDB.putString("repoBranch", repoInfo.getDefault_branch()); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); - RepositoriesApi repositoryData = new RepositoriesApi(ctx); + RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); diff --git a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java index 4c3698cd..2f86521b 100644 --- a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java @@ -17,6 +17,7 @@ import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserTokens; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityLoginBinding; @@ -358,19 +359,19 @@ public class LoginActivity extends BaseActivity { // insert new account to db if does not exist String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl"); - UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); - int checkAccount = userAccountsApi.getCount(accountName); + UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); + boolean userAccountExists = userAccountsApi.userAccountExists(accountName); long accountId; - if(checkAccount == 0) { + if(!userAccountExists) { - accountId = userAccountsApi.insertNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), loginToken, ""); + accountId = userAccountsApi.createNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), loginToken, ""); tinyDB.putInt("currentActiveAccountId", (int) accountId); } else { userAccountsApi.updateTokenByAccountName(accountName, loginToken); - UserAccount data = userAccountsApi.getAccountData(accountName); + UserAccount data = userAccountsApi.getAccountByName(accountName); tinyDB.putInt("currentActiveAccountId", data.getAccountId()); } @@ -546,20 +547,20 @@ public class LoginActivity extends BaseActivity { // insert new account to db if does not exist String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl"); - UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); - int checkAccount = userAccountsApi.getCount(accountName); + UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); + boolean userAccountExists = userAccountsApi.userAccountExists(accountName); long accountId; - if(checkAccount == 0) { + if(!userAccountExists) { accountId = userAccountsApi - .insertNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), newToken.getSha1(), ""); + .createNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), newToken.getSha1(), ""); tinyDB.putInt("currentActiveAccountId", (int) accountId); } else { userAccountsApi.updateTokenByAccountName(accountName, newToken.getSha1()); - UserAccount data = userAccountsApi.getAccountData(accountName); + UserAccount data = userAccountsApi.getAccountByName(accountName); tinyDB.putInt("currentActiveAccountId", data.getAccountId()); } diff --git a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java index 29e8565f..37dc223a 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java @@ -20,7 +20,6 @@ import androidx.appcompat.widget.Toolbar; import androidx.biometric.BiometricPrompt; import androidx.cardview.widget.CardView; import androidx.core.content.ContextCompat; -import androidx.core.content.res.ResourcesCompat; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; @@ -34,6 +33,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.adapters.UserAccountsNavAdapter; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityMainBinding; @@ -90,38 +90,25 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig ActivityMainBinding activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(activityMainBinding.getRoot()); - tinyDB.putBoolean("noConnection", false); - - String currentVersion = tinyDB.getString("giteaVersion"); - Intent mainIntent = getIntent(); - String launchFragment = mainIntent.getStringExtra("launchFragment"); + + // DO NOT MOVE + if(mainIntent.hasExtra("switchAccountId") && + AppUtil.switchToAccount(ctx, BaseApi.getInstance(ctx, UserAccountsApi.class) + .getAccountById(mainIntent.getIntExtra("switchAccountId", 0)))) { + + mainIntent.removeExtra("switchAccountId"); + recreate(); + return; + + } + // DO NOT MOVE + + tinyDB.putBoolean("noConnection", false); loginUid = tinyDB.getString("loginUid"); instanceToken = "token " + tinyDB.getString(loginUid + "-token"); - if(tinyDB.getString("dateFormat").isEmpty()) { - - tinyDB.putString("dateFormat", "pretty"); - } - - if(tinyDB.getString("codeBlockStr").isEmpty()) { - - tinyDB.putInt("codeBlockColor", ResourcesCompat.getColor(getResources(), R.color.colorLightGreen, null)); - tinyDB.putInt("codeBlockBackground", ResourcesCompat.getColor(getResources(), R.color.black, null)); - } - - if(tinyDB.getString("enableCounterIssueBadgeInit").isEmpty()) { - - tinyDB.putBoolean("enableCounterIssueBadge", true); - } - - if(tinyDB.getString("homeScreenStr").isEmpty()) { - - tinyDB.putString("homeScreenStr", "yes"); - tinyDB.putInt("homeScreenId", 0); - } - boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); if(!tinyDB.getBoolean("loggedInMode")) { @@ -130,9 +117,10 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig return; } - if(tinyDB.getInt("currentActiveAccountId") <= 0) { - - AlertDialogs.forceLogoutDialog(ctx, getResources().getString(R.string.forceLogoutDialogHeader), getResources().getString(R.string.forceLogoutDialogDescription), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + if(tinyDB.getInt("currentActiveAccountId", -1) <= 0) { + AlertDialogs.forceLogoutDialog(ctx, + getResources().getString(R.string.forceLogoutDialogHeader), + getResources().getString(R.string.forceLogoutDialogDescription), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); } Toolbar toolbar = activityMainBinding.toolbar; @@ -141,17 +129,17 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig switch(tinyDB.getInt("customFontId", -1)) { case 0: - myTypeface = Typeface.createFromAsset(getAssets(), "fonts/roboto.ttf"); break; - case 2: + case 2: myTypeface = Typeface.createFromAsset(getAssets(), "fonts/sourcecodeproregular.ttf"); break; - default: + default: myTypeface = Typeface.createFromAsset(getAssets(), "fonts/manroperegular.ttf"); break; + } // biometric auth @@ -198,43 +186,33 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig Fragment fragmentById = fm.findFragmentById(R.id.fragment_container); if(fragmentById instanceof SettingsFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleSettings)); } else if(fragmentById instanceof MyRepositoriesFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); } else if(fragmentById instanceof StarredRepositoriesFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); } else if(fragmentById instanceof OrganizationsFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations)); } else if(fragmentById instanceof ExploreFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore)); } else if(fragmentById instanceof NotificationsFragment) { - toolbarTitle.setText(R.string.pageTitleNotifications); } else if(fragmentById instanceof ProfileFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); } else if(fragmentById instanceof DraftsFragment) { - toolbarTitle.setText(getResources().getString(R.string.titleDrafts)); } else if(fragmentById instanceof AdministrationFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleAdministration)); } else if(fragmentById instanceof UserAccountsFragment) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleUserAccounts)); } @@ -275,7 +253,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig List userAccountsList = new ArrayList<>(); UserAccountsApi userAccountsApi; - userAccountsApi = new UserAccountsApi(ctx); + userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); RecyclerView navRecyclerViewUserAccounts = hView.findViewById(R.id.userAccounts); UserAccountsNavAdapter adapterUserAccounts; @@ -294,12 +272,10 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig userFullName.setTypeface(myTypeface); if(!userEmailNav.equals("")) { - userEmail.setText(userEmailNav); } if(!userFullNameNav.equals("")) { - userFullName.setText(Html.fromHtml(userFullNameNav)); } @@ -347,7 +323,8 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { navigationView.getMenu().findItem(R.id.nav_administration).setVisible(tinyDB.getBoolean("userIsAdmin")); - navigationView.getMenu().findItem(R.id.nav_notifications).setVisible(new Version(currentVersion).higherOrEqual("1.12.3")); + navigationView.getMenu().findItem(R.id.nav_notifications).setVisible(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")); + } @Override @@ -361,6 +338,8 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig toggle.syncState(); toolbar.setNavigationIcon(R.drawable.ic_menu); + String launchFragment = mainIntent.getStringExtra("launchFragment"); + if(launchFragment != null) { mainIntent.removeExtra("launchFragment"); @@ -368,13 +347,12 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig switch(launchFragment) { case "drafts": - toolbarTitle.setText(getResources().getString(R.string.titleDrafts)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit(); navigationView.setCheckedItem(R.id.nav_comments_draft); return; - case "notifications": + case "notifications": toolbarTitle.setText(getResources().getString(R.string.pageTitleNotifications)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit(); navigationView.setCheckedItem(R.id.nav_notifications); @@ -415,9 +393,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig if(savedInstanceState == null) { if(!new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) { - if(tinyDB.getInt("homeScreenId") == 7) { - tinyDB.putInt("homeScreenId", 0); } } @@ -658,29 +634,22 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig private void giteaVersion() { - final TinyDB tinyDb = TinyDB.getInstance(appCtx); - - final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); - - Call callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken(token); - + Call callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken(Authorization.get(ctx)); callVersion.enqueue(new Callback() { @Override public void onResponse(@NonNull final Call callVersion, @NonNull retrofit2.Response responseVersion) { - if(responseVersion.code() == 200) { + if(responseVersion.code() == 200 && responseVersion.body() != null) { + String version = responseVersion.body().getVersion(); - GiteaVersion version = responseVersion.body(); - assert version != null; - - tinyDb.putString("giteaVersion", version.getVersion()); + tinyDB.putString("giteaVersion", version); + BaseApi.getInstance(ctx, UserAccountsApi.class).updateServerVersion(version, tinyDB.getInt("currentActiveAccountId")); } } @Override public void onFailure(@NonNull Call callVersion, @NonNull Throwable t) { - Log.e("onFailure-version", t.toString()); } }); diff --git a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java index 54e62e0d..1d5abfb6 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java @@ -14,6 +14,7 @@ import org.gitnex.tea4j.models.RepositoryTransfer; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.databinding.ActivityRepositorySettingsBinding; import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding; @@ -139,7 +140,7 @@ public class RepositorySettingsActivity extends BaseActivity { Toasty.success(ctx, getString(R.string.repoTransferSuccess)); finish(); - RepositoriesApi.deleteRepository((int) tinyDB.getLong("repositoryId", 0)); + BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository((int) tinyDB.getLong("repositoryId", 0)); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); RepositorySettingsActivity.this.startActivity(intent); } @@ -220,7 +221,7 @@ public class RepositorySettingsActivity extends BaseActivity { Toasty.success(ctx, getString(R.string.repoDeletionSuccess)); finish(); - RepositoriesApi.deleteRepository((int) tinyDB.getLong("repositoryId", 0)); + BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository((int) tinyDB.getLong("repositoryId", 0)); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); RepositorySettingsActivity.this.startActivity(intent); } @@ -383,7 +384,7 @@ public class RepositorySettingsActivity extends BaseActivity { if(!repositoryName.equals(repoName)) { finish(); - RepositoriesApi.updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDB.getLong("repositoryId", 0)); + BaseApi.getInstance(ctx, RepositoriesApi.class).updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDB.getLong("repositoryId", 0)); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); RepositorySettingsActivity.this.startActivity(intent); } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java index 1c378fd5..01d59a9c 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java @@ -43,7 +43,13 @@ public class SettingsNotificationsActivity extends BaseActivity { viewBinding.enableNotificationsMode.setOnCheckedChangeListener((buttonView, isChecked) -> { tinyDB.putBoolean("notificationsEnabled", isChecked); - if(!isChecked) Notifications.stopWorker(ctx); + + if(isChecked) { + Notifications.startWorker(ctx); + } else { + Notifications.stopWorker(ctx); + } + Toasty.info(appCtx, getResources().getString(R.string.settingsSave)); }); diff --git a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java index f054c635..36374a24 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java @@ -17,6 +17,7 @@ import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; import org.mian.gitnex.R; import org.mian.gitnex.activities.IssueDetailActivity; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.database.models.DraftWithRepository; import org.mian.gitnex.fragments.BottomSheetReplyFragment; @@ -56,8 +57,10 @@ public class DraftsAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/java/org/mian/gitnex/adapters/ExploreRepositoriesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ExploreRepositoriesAdapter.java index 88699632..8dc78c31 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ExploreRepositoriesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ExploreRepositoriesAdapter.java @@ -19,6 +19,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.helpers.AppUtil; @@ -98,7 +99,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter { updateLayoutByPosition(getAdapterPosition()); - UserAccountsApi userAccountsApi = new UserAccountsApi(context); + UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class); userAccountsApi.deleteAccount(Integer.parseInt(String.valueOf(accountId))); }).setNeutralButton(context.getResources().getString(R.string.cancelButton), null) .show(); @@ -71,25 +72,19 @@ public class UserAccountsAdapter extends RecyclerView.Adapter { - UserAccountsApi userAccountsApi = new UserAccountsApi(context); - UserAccount userAccount = userAccountsApi.getAccountData(accountName); + UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class); + UserAccount userAccount = userAccountsApi.getAccountByName(accountName); - if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) { + if(AppUtil.switchToAccount(context, userAccount)) { String url = UrlBuilder.fromString(userAccount.getInstanceUrl()) .withPath("/") .toString(); - tinyDB.putString("loginUid", userAccount.getUserName()); - tinyDB.putString("userLogin", userAccount.getUserName()); - tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken()); - tinyDB.putString("instanceUrl", userAccount.getInstanceUrl()); - tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); - Toasty.success(context, context.getResources().getString(R.string.switchAccountSuccess, userAccount.getUserName(), url)); ((Activity) context).recreate(); - } + } }); } diff --git a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java index 7db88c76..c315ff41 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java @@ -18,12 +18,10 @@ import androidx.drawerlayout.widget.DrawerLayout; import androidx.recyclerview.widget.RecyclerView; import org.mian.gitnex.R; import org.mian.gitnex.clients.PicassoService; -import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.fragments.UserAccountsFragment; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.RoundedTransformation; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.List; import io.mikael.urlbuilder.UrlBuilder; @@ -103,7 +101,6 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter allAccountsList) { - TinyDB tinyDB = TinyDB.getInstance(context); Dialog dialog = new Dialog(context, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert); dialog.setContentView(R.layout.custom_user_accounts_dialog); @@ -120,6 +117,7 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter { - String accountNameSwitch = allAccountsList.get(which).getAccountName(); - UserAccountsApi userAccountsApi = new UserAccountsApi(context); - UserAccount userAccount = userAccountsApi.getAccountData(accountNameSwitch); + UserAccount userAccount = allAccountsList.get(which); - if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) { + if(AppUtil.switchToAccount(context, userAccount)) { String url = UrlBuilder.fromString(userAccount.getInstanceUrl()) .withPath("/") .toString(); - tinyDB.putString("loginUid", userAccount.getUserName()); - tinyDB.putString("userLogin", userAccount.getUserName()); - tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken()); - tinyDB.putString("instanceUrl", userAccount.getInstanceUrl()); - tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); - Toasty.success(context, context.getResources().getString(R.string.switchAccountSuccess, userAccount.getUserName(), url)); ((Activity) context).recreate(); dialog.dismiss(); + } }); + dialog.show(); } diff --git a/app/src/main/java/org/mian/gitnex/core/MainApplication.java b/app/src/main/java/org/mian/gitnex/core/MainApplication.java index 5fd91d2c..cb921174 100644 --- a/app/src/main/java/org/mian/gitnex/core/MainApplication.java +++ b/app/src/main/java/org/mian/gitnex/core/MainApplication.java @@ -3,6 +3,7 @@ package org.mian.gitnex.core; import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; +import androidx.core.content.res.ResourcesCompat; import org.acra.ACRA; import org.acra.BuildConfig; import org.acra.ReportField; @@ -34,7 +35,6 @@ import org.mian.gitnex.notifications.Notifications; public class MainApplication extends Application { - private Context appCtx; private TinyDB tinyDB; @Override @@ -42,7 +42,7 @@ public class MainApplication extends Application { super.onCreate(); - appCtx = getApplicationContext(); + Context appCtx = getApplicationContext(); tinyDB = TinyDB.getInstance(appCtx); setDefaults(); @@ -76,6 +76,7 @@ public class MainApplication extends Application { @Override protected void attachBaseContext(Context context) { + super.attachBaseContext(context); tinyDB = TinyDB.getInstance(context); @@ -97,46 +98,59 @@ public class MainApplication extends Application { // enabling counter badges by default if(tinyDB.getString("enableCounterBadgesInit").isEmpty()) { - tinyDB.putBoolean("enableCounterBadges", true); tinyDB.putString("enableCounterBadgesInit", "yes"); } // enable crash reports by default if(tinyDB.getString("crashReportingEnabledInit").isEmpty()) { - tinyDB.putBoolean("crashReportingEnabled", true); tinyDB.putString("crashReportingEnabledInit", "yes"); } // default cache setter if(tinyDB.getString("cacheSizeStr").isEmpty()) { - tinyDB.putString("cacheSizeStr", getResources().getString(R.string.cacheSizeDataSelectionSelectedText)); } if(tinyDB.getString("cacheSizeImagesStr").isEmpty()) { - tinyDB.putString("cacheSizeImagesStr", getResources().getString(R.string.cacheSizeImagesSelectionSelectedText)); } // enable comment drafts by default if(tinyDB.getString("draftsCommentsDeletionEnabledInit").isEmpty()) { - tinyDB.putBoolean("draftsCommentsDeletionEnabled", true); tinyDB.putString("draftsCommentsDeletionEnabledInit", "yes"); } // setting default polling delay if(tinyDB.getInt("pollingDelayMinutes", 0) <= 0) { - tinyDB.putInt("pollingDelayMinutes", Constants.defaultPollingDelay); } // disable biometric by default if(tinyDB.getString("biometricStatusInit").isEmpty()) { - tinyDB.putBoolean("biometricStatus", false); tinyDB.putString("biometricStatusInit", "yes"); } + + // set default date format + if(tinyDB.getString("dateFormat").isEmpty()) { + tinyDB.putString("dateFormat", "pretty"); + } + + if(tinyDB.getString("codeBlockStr").isEmpty()) { + tinyDB.putInt("codeBlockColor", ResourcesCompat.getColor(getResources(), R.color.colorLightGreen, null)); + tinyDB.putInt("codeBlockBackground", ResourcesCompat.getColor(getResources(), R.color.black, null)); + } + + if(tinyDB.getString("enableCounterIssueBadgeInit").isEmpty()) { + tinyDB.putBoolean("enableCounterIssueBadge", true); + } + + if(tinyDB.getString("homeScreenStr").isEmpty()) { + tinyDB.putString("homeScreenStr", "yes"); + tinyDB.putInt("homeScreenId", 0); + } + } } diff --git a/app/src/main/java/org/mian/gitnex/database/api/BaseApi.java b/app/src/main/java/org/mian/gitnex/database/api/BaseApi.java new file mode 100644 index 00000000..ac5beaa8 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/database/api/BaseApi.java @@ -0,0 +1,57 @@ +package org.mian.gitnex.database.api; + +import android.content.Context; +import androidx.annotation.NonNull; +import org.mian.gitnex.database.db.GitnexDatabase; +import org.mian.gitnex.helpers.Constants; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author opyale + */ + +public abstract class BaseApi { + + private static final Map, Object> instances = new HashMap<>(); + + protected static final ExecutorService executorService = Executors.newCachedThreadPool(); + protected final GitnexDatabase gitnexDatabase; + + protected BaseApi(Context context) { + gitnexDatabase = GitnexDatabase.getDatabaseInstance(context); + } + + public static T getInstance(@NonNull Context context, @NonNull Class clazz) { + + try { + + if(!instances.containsKey(clazz)) { + synchronized(BaseApi.class) { + if(!instances.containsKey(clazz)) { + + T instance = clazz + .getDeclaredConstructor(Context.class) + .newInstance(context); + + instances.put(clazz, instance); + return instance; + } + } + } + + return (T) instances.get(clazz); + + } catch(NoSuchMethodException | IllegalAccessException | + InvocationTargetException | InstantiationException ignored) {} + + return null; + } + +} diff --git a/app/src/main/java/org/mian/gitnex/database/api/DraftsApi.java b/app/src/main/java/org/mian/gitnex/database/api/DraftsApi.java index 8a4307f0..24b8b688 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/DraftsApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/DraftsApi.java @@ -1,30 +1,23 @@ package org.mian.gitnex.database.api; import android.content.Context; -import android.util.Log; import androidx.lifecycle.LiveData; import org.mian.gitnex.database.dao.DraftsDao; -import org.mian.gitnex.database.db.GitnexDatabase; import org.mian.gitnex.database.models.Draft; import org.mian.gitnex.database.models.DraftWithRepository; -import org.mian.gitnex.helpers.Constants; import java.util.List; /** * Author M M Arif */ -public class DraftsApi { +public class DraftsApi extends BaseApi { - private static DraftsDao draftsDao; - private static long draftId; - private static Integer checkDraftFlag; + private final DraftsDao draftsDao; - public DraftsApi(Context context) { - - GitnexDatabase db; - db = GitnexDatabase.getDatabaseInstance(context); - draftsDao = db.draftsDao(); + DraftsApi(Context context) { + super(context); + draftsDao = gitnexDatabase.draftsDao(); } public long insertDraft(int repositoryId, int draftAccountId, int issueId, String draftText, String draftType, String commentId, String issueType) { @@ -41,87 +34,44 @@ public class DraftsApi { return insertDraftAsyncTask(draft); } - private static long insertDraftAsyncTask(final Draft draft) { - - try { - - Thread thread = new Thread(() -> draftId = draftsDao.insertDraft(draft)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.draftsApi, e.toString()); - } - - return draftId; + private long insertDraftAsyncTask(final Draft draft) { + return draftsDao.insertDraft(draft); } public long getDraftIdAsync(int issueId, int draftRepositoryId) { - - try { - - Thread thread = new Thread(() -> draftId = draftsDao.getDraftId(issueId, draftRepositoryId)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.draftsApi, e.toString()); - } - - return draftId; + return draftsDao.getDraftId(issueId, draftRepositoryId); } public Integer checkDraft(int issueId, int draftRepositoryId, String commentId) { - - try { - - Thread thread = new Thread(() -> checkDraftFlag = draftsDao.checkDraftDao(issueId, draftRepositoryId, commentId)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.draftsApi, e.toString()); - } - - return checkDraftFlag; + return draftsDao.checkDraftDao(issueId, draftRepositoryId, commentId); } public LiveData> getDrafts(int accountId) { - return draftsDao.fetchAllDrafts(accountId); } public LiveData getDraftByIssueId(int issueId) { - return draftsDao.fetchDraftByIssueId(issueId); } public void deleteSingleDraft(final int draftId) { - final LiveData draft = draftsDao.fetchDraftById(draftId); if(draft != null) { - - new Thread(() -> draftsDao.deleteByDraftId(draftId)).start(); + executorService.execute(() -> draftsDao.deleteByDraftId(draftId)); } } - public static void deleteAllDrafts(final int accountId) { - - new Thread(() -> draftsDao.deleteAllDrafts(accountId)).start(); + public void deleteAllDrafts(final int accountId) { + executorService.execute(() -> draftsDao.deleteAllDrafts(accountId)); } - public static void updateDraft(final String draftText, final int draftId, final String commentId) { - - new Thread(() -> draftsDao.updateDraft(draftText, draftId, commentId)).start(); + public void updateDraft(final String draftText, final int draftId, final String commentId) { + executorService.execute(() -> draftsDao.updateDraft(draftText, draftId, commentId)); } - public static void updateDraftByIssueIdAsyncTask(final String draftText, final int issueId, final int draftRepositoryId, final String commentId) { - - new Thread(() -> draftsDao.updateDraftByIssueId(draftText, issueId, draftRepositoryId, commentId)).start(); + public void updateDraftByIssueIdAsyncTask(final String draftText, final int issueId, final int draftRepositoryId, final String commentId) { + executorService.execute(() -> draftsDao.updateDraftByIssueId(draftText, issueId, draftRepositoryId, commentId)); } } diff --git a/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java b/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java index ef5e1f5d..effc415d 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java @@ -1,30 +1,22 @@ package org.mian.gitnex.database.api; import android.content.Context; -import android.util.Log; import androidx.lifecycle.LiveData; import org.mian.gitnex.database.dao.RepositoriesDao; -import org.mian.gitnex.database.db.GitnexDatabase; import org.mian.gitnex.database.models.Repository; -import org.mian.gitnex.helpers.Constants; import java.util.List; /** * Author M M Arif */ -public class RepositoriesApi { +public class RepositoriesApi extends BaseApi { - private static RepositoriesDao repositoriesDao; - private static long repositoryId; - private static Repository repository; - private static Integer checkRepository; + private final RepositoriesDao repositoriesDao; - public RepositoriesApi(Context context) { - - GitnexDatabase db; - db = GitnexDatabase.getDatabaseInstance(context); - repositoriesDao = db.repositoriesDao(); + RepositoriesApi(Context context) { + super(context); + repositoriesDao = gitnexDatabase.repositoriesDao(); } public long insertRepository(int repoAccountId, String repositoryOwner, String repositoryName) { @@ -38,108 +30,43 @@ public class RepositoriesApi { } public long insertRepositoryAsyncTask(Repository repository) { - - try { - - Thread thread = new Thread(() -> repositoryId = repositoriesDao.newRepository(repository)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.repositoriesApi, e.toString()); - } - - return repositoryId; + return repositoriesDao.newRepository(repository); } public Repository getRepository(int repoAccountId, String repositoryOwner, String repositoryName) { - - try { - - Thread thread = new Thread(() -> repository = repositoriesDao.getSingleRepositoryDao(repoAccountId, repositoryOwner, repositoryName)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.repositoriesApi, e.toString()); - } - - return repository; + return repositoriesDao.getSingleRepositoryDao(repoAccountId, repositoryOwner, repositoryName); } public LiveData> getAllRepositories() { - return repositoriesDao.fetchAllRepositories(); } public LiveData> getAllRepositoriesByAccount(int repoAccountId) { - return repositoriesDao.getAllRepositoriesByAccountDao(repoAccountId); } public Integer checkRepository(int repoAccountId, String repositoryOwner, String repositoryName) { - - try { - - Thread thread = new Thread(() -> checkRepository = repositoriesDao.checkRepositoryDao(repoAccountId, repositoryOwner, repositoryName)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.repositoriesApi, e.toString()); - } - - return checkRepository; + return repositoriesDao.checkRepositoryDao(repoAccountId, repositoryOwner, repositoryName); } public Repository fetchRepositoryById(int repositoryId) { - - try { - - Thread thread = new Thread(() -> repository = repositoriesDao.fetchRepositoryByIdDao(repositoryId)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.repositoriesApi, e.toString()); - } - - return repository; + return repositoriesDao.fetchRepositoryByIdDao(repositoryId); } public Repository fetchRepositoryByAccountIdByRepositoryId(int repositoryId, int repoAccountId) { - - try { - - Thread thread = new Thread(() -> repository = repositoriesDao.fetchRepositoryByAccountIdByRepositoryIdDao(repositoryId, repoAccountId)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.repositoriesApi, e.toString()); - } - - return repository; + return repositoriesDao.fetchRepositoryByAccountIdByRepositoryIdDao(repositoryId, repoAccountId); } - public static void updateRepositoryOwnerAndName(String repositoryOwner, String repositoryName, int repositoryId) { - - new Thread(() -> repositoriesDao.updateRepositoryOwnerAndName(repositoryOwner, repositoryName, repositoryId)).start(); + public void updateRepositoryOwnerAndName(String repositoryOwner, String repositoryName, int repositoryId) { + executorService.execute(() -> repositoriesDao.updateRepositoryOwnerAndName(repositoryOwner, repositoryName, repositoryId)); } - public static void deleteRepositoriesByAccount(final int repoAccountId) { - - new Thread(() -> repositoriesDao.deleteRepositoriesByAccount(repoAccountId)).start(); + public void deleteRepositoriesByAccount(final int repoAccountId) { + executorService.execute(() -> repositoriesDao.deleteRepositoriesByAccount(repoAccountId)); } - public static void deleteRepository(final int repositoryId) { - - new Thread(() -> repositoriesDao.deleteRepository(repositoryId)).start(); + public void deleteRepository(final int repositoryId) { + executorService.execute(() -> repositoriesDao.deleteRepository(repositoryId)); } } diff --git a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java index 482da27b..80b5d920 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java @@ -1,34 +1,25 @@ package org.mian.gitnex.database.api; import android.content.Context; -import android.util.Log; import androidx.lifecycle.LiveData; import org.mian.gitnex.database.dao.UserAccountsDao; -import org.mian.gitnex.database.db.GitnexDatabase; import org.mian.gitnex.database.models.UserAccount; -import org.mian.gitnex.helpers.Constants; import java.util.List; /** * Author M M Arif */ -public class UserAccountsApi { +public class UserAccountsApi extends BaseApi { - private static UserAccountsDao userAccountsDao; - private static UserAccount userAccount; - private static List userAccounts; - private static Integer checkAccount; - private static long accountId; + private final UserAccountsDao userAccountsDao; - public UserAccountsApi(Context context) { - - GitnexDatabase db; - db = GitnexDatabase.getDatabaseInstance(context); - userAccountsDao = db.userAccountsDao(); + UserAccountsApi(Context context) { + super(context); + userAccountsDao = gitnexDatabase.userAccountsDao(); } - public long insertNewAccount(String accountName, String instanceUrl, String userName, String token, String serverVersion) { + public long createNewAccount(String accountName, String instanceUrl, String userName, String token, String serverVersion) { UserAccount userAccount = new UserAccount(); userAccount.setAccountName(accountName); @@ -37,96 +28,48 @@ public class UserAccountsApi { userAccount.setToken(token); userAccount.setServerVersion(serverVersion); - return insertNewAccountAsync(userAccount); + return userAccountsDao.createAccount(userAccount); + } - private static long insertNewAccountAsync(final UserAccount userAccount) { - - try { - - Thread thread = new Thread(() -> accountId = userAccountsDao.newAccount(userAccount)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.userAccountsApi, e.toString()); - } - - return accountId; - } - - public static void updateServerVersion(final String serverVersion, final int accountId) { - - new Thread(() -> userAccountsDao.updateServerVersion(serverVersion, accountId)).start(); + public void updateServerVersion(final String serverVersion, final int accountId) { + executorService.execute(() -> userAccountsDao.updateServerVersion(serverVersion, accountId)); } public void updateToken(final int accountId, final String token) { - - new Thread(() -> userAccountsDao.updateAccountToken(accountId, token)).start(); + executorService.execute(() -> userAccountsDao.updateAccountToken(accountId, token)); } public void updateTokenByAccountName(final String accountName, final String token) { - - new Thread(() -> userAccountsDao.updateAccountTokenByAccountName(accountName, token)).start(); + executorService.execute(() -> userAccountsDao.updateAccountTokenByAccountName(accountName, token)); } - public UserAccount getAccountData(String accountName) { - - try { - - Thread thread = new Thread(() -> userAccount = userAccountsDao.fetchRowByAccount_(accountName)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.userAccountsApi, e.toString()); - } - - return userAccount; + public UserAccount getAccountByName(String accountName) { + return userAccountsDao.getAccountByName(accountName); } - public Integer getCount(String accountName) { + public UserAccount getAccountById(int accountId) { + return userAccountsDao.getAccountById(accountId); + } - try { + public Integer getCount() { + return userAccountsDao.getCount(); + } - Thread thread = new Thread(() -> checkAccount = userAccountsDao.getCount(accountName)); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.userAccountsApi, e.toString()); - } - - return checkAccount; + public Boolean userAccountExists(String accountName) { + return userAccountsDao.userAccountExists(accountName); } public LiveData> getAllAccounts() { - - return userAccountsDao.fetchAllAccounts(); + return userAccountsDao.getAllAccounts(); } public List usersAccounts() { - - try { - - Thread thread = new Thread(() -> userAccounts = userAccountsDao.userAccounts()); - thread.start(); - thread.join(); - } - catch(InterruptedException e) { - - Log.e(Constants.userAccountsApi, e.toString()); - } - - return userAccounts; + return userAccountsDao.userAccounts(); } public void deleteAccount(final int accountId) { - - new Thread(() -> userAccountsDao.deleteAccount(accountId)).start(); + executorService.execute(() -> userAccountsDao.deleteAccount(accountId)); } } diff --git a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java index 9abad2db..fd1e249b 100644 --- a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java +++ b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java @@ -15,22 +15,25 @@ import java.util.List; public interface UserAccountsDao { @Insert - long newAccount(UserAccount userAccounts); + long createAccount(UserAccount userAccounts); @Query("SELECT * FROM UserAccounts ORDER BY accountId ASC") - LiveData> fetchAllAccounts(); + LiveData> getAllAccounts(); @Query("SELECT * FROM UserAccounts ORDER BY accountId ASC") List userAccounts(); - @Query("SELECT COUNT(accountId) FROM UserAccounts WHERE accountName = :accountName") - Integer getCount(String accountName); + @Query("SELECT COUNT(accountId) FROM UserAccounts") + Integer getCount(); - @Query("SELECT * FROM UserAccounts WHERE accountName = :accountName") - UserAccount fetchRowByAccount_(String accountName); + @Query("SELECT COUNT(accountId) FROM UserAccounts WHERE accountName = :accountName LIMIT 1") + Boolean userAccountExists(String accountName); - @Query("SELECT * FROM UserAccounts WHERE accountId = :accountId") - UserAccount fetchRowByAccountId(int accountId); + @Query("SELECT * FROM UserAccounts WHERE accountName = :accountName LIMIT 1") + UserAccount getAccountByName(String accountName); + + @Query("SELECT * FROM UserAccounts WHERE accountId = :accountId LIMIT 1") + UserAccount getAccountById(int accountId); @Query("UPDATE UserAccounts SET serverVersion = :serverVersion WHERE accountId = :accountId") void updateServerVersion(String serverVersion, int accountId); diff --git a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java index 3669d8ea..b0fa21ac 100644 --- a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java +++ b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java @@ -22,32 +22,16 @@ import org.mian.gitnex.database.models.UserAccount; version = 3, exportSchema = false) public abstract class GitnexDatabase extends RoomDatabase { + private static final String DB_NAME = "gitnex"; private static GitnexDatabase gitnexDatabase; - public static GitnexDatabase getDatabaseInstance(Context context) { - - if (gitnexDatabase == null) { - - String DB_NAME = "gitnex"; - gitnexDatabase = Room.databaseBuilder(context, GitnexDatabase.class, DB_NAME) - //.fallbackToDestructiveMigration() - .addMigrations(MIGRATION_1_2, MIGRATION_2_3) - .build(); - } - - return gitnexDatabase; - } - public abstract DraftsDao draftsDao(); - public abstract RepositoriesDao repositoriesDao(); - public abstract UserAccountsDao userAccountsDao(); private static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - //database.execSQL("DROP TABLE Drafts"); database.execSQL("ALTER TABLE 'Drafts' ADD COLUMN 'commentId' TEXT"); } @@ -56,8 +40,27 @@ public abstract class GitnexDatabase extends RoomDatabase { private static final Migration MIGRATION_2_3 = new Migration(2, 3) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - database.execSQL("ALTER TABLE 'Drafts' ADD COLUMN 'issueType' TEXT"); } }; + + public static GitnexDatabase getDatabaseInstance(Context context) { + + if (gitnexDatabase == null) { + synchronized(GitnexDatabase.class) { + if(gitnexDatabase == null) { + + gitnexDatabase = Room.databaseBuilder(context, GitnexDatabase.class, DB_NAME) + // .fallbackToDestructiveMigration() + .allowMainThreadQueries() + .addMigrations(MIGRATION_1_2, MIGRATION_2_3) + .build(); + + } + } + } + + return gitnexDatabase; + + } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java index 851075dd..7fc9a84a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java @@ -24,6 +24,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.actions.ActionResult; import org.mian.gitnex.actions.IssueActions; import org.mian.gitnex.activities.MainActivity; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.databinding.BottomSheetReplyLayoutBinding; import org.mian.gitnex.helpers.Constants; @@ -57,7 +58,7 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { super.onAttach(context); tinyDB = TinyDB.getInstance(context); - draftsApi = new DraftsApi(context); + draftsApi = BaseApi.getInstance(context, DraftsApi.class); repositoryId = (int) tinyDB.getLong("repositoryId", 0); currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); @@ -281,7 +282,7 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { } else { - DraftsApi.updateDraft(text, (int) draftId, "TODO"); + draftsApi.updateDraft(text, (int) draftId, "TODO"); } draftsHint.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java index 6a63f49f..f53f6d1e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java @@ -22,6 +22,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.DraftsAdapter; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.database.models.DraftWithRepository; import org.mian.gitnex.databinding.FragmentDraftsBinding; @@ -59,7 +60,7 @@ public class DraftsFragment extends Fragment { TinyDB tinyDb = TinyDB.getInstance(ctx); draftsList_ = new ArrayList<>(); - draftsApi = new DraftsApi(ctx); + draftsApi = BaseApi.getInstance(ctx, DraftsApi.class); noData = fragmentDraftsBinding.noData; mRecyclerView = fragmentDraftsBinding.recyclerView; @@ -123,7 +124,7 @@ public class DraftsFragment extends Fragment { if(draftsList_.size() > 0) { - DraftsApi.deleteAllDrafts(accountId); + BaseApi.getInstance(ctx, DraftsApi.class).deleteAllDrafts(accountId); draftsList_.clear(); adapter.notifyDataSetChanged(); Toasty.success(ctx, getResources().getString(R.string.draftsDeleteSuccess)); diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java index d1eb44e5..7cf70021 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java @@ -63,8 +63,7 @@ public class RepositoriesFragment extends Fragment { mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), - DividerItemDecoration.VERTICAL); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration); createNewRepo = fragmentRepositoriesBinding.addNewRepo; diff --git a/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java index b83985b0..4f13a352 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java @@ -18,6 +18,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.activities.AddNewAccountActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.UserAccountsAdapter; +import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.FragmentUserAccountsBinding; @@ -48,7 +49,7 @@ public class UserAccountsFragment extends Fragment { ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.pageTitleUserAccounts)); userAccountsList = new ArrayList<>(); - userAccountsApi = new UserAccountsApi(ctx); + userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); mRecyclerView = fragmentUserAccountsBinding.recyclerView; final SwipeRefreshLayout swipeRefresh = fragmentUserAccountsBinding.pullToRefresh; diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index 0a539feb..c714b294 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -13,6 +13,7 @@ import android.util.TypedValue; import android.view.View; import androidx.annotation.ColorInt; import androidx.core.content.pm.PackageInfoCompat; +import org.mian.gitnex.database.models.UserAccount; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -69,7 +70,6 @@ public class AppUtil { } public static boolean hasNetworkConnection(Context context) { - return NetworkStatusObserver.getInstance(context).hasNetworkConnection(); } @@ -274,32 +274,27 @@ public class AppUtil { } public static String getLastCharactersOfWord(String str, int count) { - return str.substring(str.length() - count); } public static void setMultiVisibility(int visibility, View... views) { - for(View view : views) { - view.setVisibility(visibility); } } public static int getPixelsFromDensity(Context context, int dp) { - return (int) (context.getResources().getDisplayMetrics().density * dp); } public static int getPixelsFromScaledDensity(Context context, int sp) { - return (int) (context.getResources().getDisplayMetrics().scaledDensity * sp); } - public static int getLineCount(String s) { + public static long getLineCount(String s) { - int lines = 0; + long lines = 0; Pattern pattern = Pattern.compile("(\r\n|\r|\n)"); Matcher matcher = pattern.matcher(s); @@ -307,6 +302,11 @@ public class AppUtil { while(matcher.find()) lines++; + // Sometimes there may be text, but no line breaks. + // This should still count as one line. + if(s.length() > 0 && lines == 0) + return 1; + return lines; } @@ -320,5 +320,27 @@ public class AppUtil { clipboard.setPrimaryClip(clip); Toasty.info(ctx, message); + } + + public static boolean switchToAccount(Context context, UserAccount userAccount) { + + TinyDB tinyDB = TinyDB.getInstance(context); + + if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) { + + tinyDB.putString("loginUid", userAccount.getUserName()); + tinyDB.putString("userLogin", userAccount.getUserName()); + tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken()); + tinyDB.putString("instanceUrl", userAccount.getInstanceUrl()); + tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); + + return true; + + } + + return false; + + } + } diff --git a/app/src/main/java/org/mian/gitnex/helpers/Authorization.java b/app/src/main/java/org/mian/gitnex/helpers/Authorization.java index e97dd246..30cf1126 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Authorization.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Authorization.java @@ -1,6 +1,7 @@ package org.mian.gitnex.helpers; import android.content.Context; +import org.mian.gitnex.database.models.UserAccount; import okhttp3.Credentials; /** @@ -24,11 +25,14 @@ public class Authorization { } + public static String get(UserAccount userAccount) { + return "token " + userAccount.getToken(); + } + public static String getWeb(Context context) { TinyDB tinyDb = TinyDB.getInstance(context); return Credentials.basic("", tinyDb.getString(tinyDb.getString("loginUid") + "-token")); - } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/Constants.java b/app/src/main/java/org/mian/gitnex/helpers/Constants.java index ddb0e23b..c9683935 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Constants.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Constants.java @@ -56,6 +56,11 @@ public class Constants { public static final String mainNotificationChannelId = "main_channel"; public static final String downloadNotificationChannelId = "dl_channel"; + public static final long[] defaultVibrationPattern = new long[] { 1000, 1000 }; + public static final String[] fallbackReactions = new String[]{"+1", "-1", "laugh", "hooray", "confused", "heart", "rocket", "eyes"}; + // work managers + public static final String notificationsWorkerId = "notifications_worker"; + } diff --git a/app/src/main/java/org/mian/gitnex/helpers/Version.java b/app/src/main/java/org/mian/gitnex/helpers/Version.java index 50bc6c4c..a6b1da91 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Version.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Version.java @@ -50,7 +50,7 @@ public class Version { final Pattern pattern_number_dot_number = Pattern.compile("^\\d+(\\.(\\d)+)*"); if(!valid(raw)) { - throw new IllegalArgumentException("Invalid version format"); + throw new IllegalArgumentException("Invalid version format: " + raw); } if(raw.charAt(0) == 'v' || raw.charAt(0) == 'V') { diff --git a/app/src/main/java/org/mian/gitnex/helpers/highlightjs/HighlightJsView.java b/app/src/main/java/org/mian/gitnex/helpers/highlightjs/HighlightJsView.java deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java index f7a65575..ff3c0e9b 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java +++ b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java @@ -1,5 +1,6 @@ package org.mian.gitnex.helpers.views; +import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; @@ -36,19 +37,16 @@ public class SyntaxHighlightedArea extends LinearLayout { private LinesView linesView; public SyntaxHighlightedArea(@NonNull Context context) { - super(context); setup(); } public SyntaxHighlightedArea(@NonNull Context context, @Nullable AttributeSet attrs) { - super(context, attrs); setup(); } public SyntaxHighlightedArea(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); setup(); } @@ -62,9 +60,10 @@ public class SyntaxHighlightedArea extends LinearLayout { sourceView = new TextView(getContext()); sourceView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - sourceView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); sourceView.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/sourcecodeproregular.ttf")); + sourceView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); sourceView.setTextColor(prism4jTheme.textColor()); + sourceView.setTextIsSelectable(true); int padding = AppUtil.getPixelsFromDensity(getContext(), 5); sourceView.setPadding(padding, 0, padding, 0); @@ -97,34 +96,57 @@ public class SyntaxHighlightedArea extends LinearLayout { public void setContent(@NonNull String source, @NonNull String extension) { if(source.length() > 0) { - linesView.setLineCount(AppUtil.getLineCount(source)); - try { + Thread highlightingThread = new Thread(() -> { - MainGrammarLocator mainGrammarLocator = MainGrammarLocator.getInstance(); - Prism4j prism4j = new Prism4j(mainGrammarLocator); + try { - CharSequence highlightedSource = Prism4jSyntaxHighlight.create(prism4j, prism4jTheme, MainGrammarLocator.DEFAULT_FALLBACK_LANGUAGE) - .highlight(mainGrammarLocator.fromExtension(extension), source); + MainGrammarLocator mainGrammarLocator = MainGrammarLocator.getInstance(); - if(highlightedSource.charAt(highlightedSource.length() - 1) == '\n') { - // Removes a line break which is probably added by Prism4j but not actually present in the source. - // This line should be altered in case this gets fixed. - sourceView.setText(highlightedSource.subSequence(0, highlightedSource.length() - 1)); - } - else { - sourceView.setText(highlightedSource); + CharSequence highlightedSource = Prism4jSyntaxHighlight + .create(new Prism4j(mainGrammarLocator), prism4jTheme, MainGrammarLocator.DEFAULT_FALLBACK_LANGUAGE) + .highlight(mainGrammarLocator.fromExtension(extension), source); + + getActivity().runOnUiThread(() -> { + if(highlightedSource.charAt(highlightedSource.length() - 1) == '\n') { + // Removes a line break which is probably added by Prism4j but not actually present in the source. + // This line should be altered in case this gets fixed. + sourceView.setText(highlightedSource.subSequence(0, highlightedSource.length() - 1)); + } else { + sourceView.setText(highlightedSource); + } + }); + + } catch(Throwable ignored) { + // Fall back to plaintext if something fails + getActivity().runOnUiThread(() -> sourceView.setText(source)); } - } catch(Throwable ignored) { - // Fall back to plaintext if something fails - sourceView.setText(source); - } + }); + + Thread lineCountingThread = new Thread(() -> { + + long lineCount = AppUtil.getLineCount(source); + + try { + highlightingThread.join(); + } catch(InterruptedException ignored) {} + + getActivity().runOnUiThread(() -> linesView.setLineCount(lineCount)); + + }); + + highlightingThread.start(); + lineCountingThread.start(); + } } - public String getContent() { + private Activity getActivity() { + return (Activity) getContext(); + } + public String getContent() { return sourceView.getText().toString(); } @@ -137,27 +159,31 @@ public class SyntaxHighlightedArea extends LinearLayout { @ColorInt private int textColor; @ColorInt private int lineColor; - private int lineCount; + private long lineCount; public LinesView(Context context) { super(context); } - public void setLineCount(int lineCount) { + public void setLineCount(long lineCount) { this.lineCount = lineCount; + requestLayout(); } @Override public void setBackgroundColor(@ColorInt int backgroundColor) { this.backgroundColor = backgroundColor; + invalidate(); } public void setTextColor(@ColorInt int textColor) { this.textColor = textColor; + invalidate(); } public void setLineColor(@ColorInt int lineColor) { this.lineColor = lineColor; + invalidate(); } public Paint getPaint() { diff --git a/app/src/main/java/org/mian/gitnex/notifications/Notifications.java b/app/src/main/java/org/mian/gitnex/notifications/Notifications.java index 68cb399c..cf03e691 100644 --- a/app/src/main/java/org/mian/gitnex/notifications/Notifications.java +++ b/app/src/main/java/org/mian/gitnex/notifications/Notifications.java @@ -13,7 +13,6 @@ import androidx.work.WorkManager; import org.mian.gitnex.R; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; import java.util.concurrent.TimeUnit; /** @@ -22,8 +21,6 @@ import java.util.concurrent.TimeUnit; public class Notifications { - private static int notificationsSupported = -1; - public static int uniqueNotificationId(Context context) { TinyDB tinyDB = TinyDB.getInstance(context); @@ -51,7 +48,7 @@ public class Notifications { mainChannel.setDescription(context.getString(R.string.mainNotificationChannelDescription)); if(tinyDB.getBoolean("notificationsEnableVibration", true)) { - mainChannel.setVibrationPattern(new long[] { 1000, 1000 }); + mainChannel.setVibrationPattern(Constants.defaultVibrationPattern); mainChannel.enableVibration(true); } else { mainChannel.enableVibration(false); @@ -75,7 +72,7 @@ public class Notifications { public static void stopWorker(Context context) { - WorkManager.getInstance(context).cancelAllWorkByTag(context.getPackageName()); + WorkManager.getInstance(context).cancelAllWorkByTag(Constants.notificationsWorkerId); } public static void startWorker(Context context) { @@ -84,42 +81,25 @@ public class Notifications { if(tinyDB.getBoolean("notificationsEnabled", true)) { - if(notificationsSupported == -1) checkVersion(tinyDB); - - if(notificationsSupported == 1) { - - Constraints.Builder constraints = new Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .setRequiresBatteryNotLow(false) - .setRequiresStorageNotLow(false) - .setRequiresCharging(false); - - if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - - constraints.setRequiresDeviceIdle(false); - } - - int pollingDelayMinutes = Math.max(tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay), 15); - - PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotificationsWorker.class, pollingDelayMinutes, TimeUnit.MINUTES) - .setConstraints(constraints.build()) - .addTag(context.getPackageName()) - .build(); - - WorkManager.getInstance(context).enqueueUniquePeriodicWork(context.getPackageName(), ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest); + Constraints.Builder constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .setRequiresBatteryNotLow(false) + .setRequiresStorageNotLow(false) + .setRequiresCharging(false); + if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + constraints.setRequiresDeviceIdle(false); } + + int pollingDelayMinutes = Math.max(tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay), 15); + + PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotificationsWorker.class, pollingDelayMinutes, TimeUnit.MINUTES) + .setConstraints(constraints.build()) + .addTag(Constants.notificationsWorkerId) + .build(); + + WorkManager.getInstance(context).enqueueUniquePeriodicWork(Constants.notificationsWorkerId, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest); + } } - - private static void checkVersion(TinyDB tinyDB) { - - String currentVersion = tinyDB.getString("giteaVersion"); - - if(tinyDB.getBoolean("loggedInMode") && !currentVersion.isEmpty()) { - - notificationsSupported = new Version(currentVersion).higherOrEqual("1.12.3") ? 1 : 0; - } - } - } diff --git a/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java b/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java index cdf40405..f80a861e 100644 --- a/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java +++ b/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java @@ -15,12 +15,18 @@ import org.gitnex.tea4j.models.NotificationThread; import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.UserAccountsApi; +import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.Version; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import retrofit2.Call; import retrofit2.Response; @@ -30,86 +36,101 @@ import retrofit2.Response; public class NotificationsWorker extends Worker { - private static final int MAXIMUM_NOTIFICATIONS = 100; - private final Context context; private final TinyDB tinyDB; + private final Map> userAccounts; public NotificationsWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); + UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class); + this.context = context; this.tinyDB = TinyDB.getInstance(context); + this.userAccounts = new HashMap<>(userAccountsApi.getCount()); + for(UserAccount userAccount : userAccountsApi.usersAccounts()) { + + // We do also accept empty values, since the server version was not saved properly in the beginning. + if(userAccount.getServerVersion() == null || userAccount.getServerVersion().isEmpty() || + new Version(userAccount.getServerVersion()).higherOrEqual("1.12.3")) { + + Map userAccountParameters = new HashMap<>(); + userAccountParameters.put("previousTimestamp", AppUtil.getTimestampFromDate(context, new Date())); + + userAccounts.put(userAccount, userAccountParameters); + } + } } @NonNull @Override public Result doWork() { + pollingLoops(); + return Result.success(); + } - int notificationLoops = tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay) >= 15 ? 1 : Math.min(15 - tinyDB.getInt("pollingDelayMinutes"), 10); + /** + * Used to bypass the 15-minute limit of {@code WorkManager}. + */ + private void pollingLoops() { + int notificationLoops = tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay) < 15 ? + Math.min(15 - tinyDB.getInt("pollingDelayMinutes"), 10) : 1; for(int i = 0; i < notificationLoops; i++) { - long startPollingTime = System.currentTimeMillis(); - try { - - String previousRefreshTimestamp = tinyDB.getString("previousRefreshTimestamp", AppUtil.getTimestampFromDate(context, new Date())); - - Call> call = RetrofitClient - .getApiInterface(context) - .getNotificationThreads(Authorization.get(context), false, new String[]{"unread"}, previousRefreshTimestamp, - null, 1, MAXIMUM_NOTIFICATIONS); - - Response> response = call.execute(); - - if(response.code() == 200) { - - assert response.body() != null; - - List notificationThreads = response.body(); - - if(!notificationThreads.isEmpty()) - sendNotification(notificationThreads); - - tinyDB.putString("previousRefreshTimestamp", AppUtil.getTimestampFromDate(context, new Date())); - } - - } catch(Exception ignored) {} + startPolling(); try { if(notificationLoops > 1 && i < (notificationLoops - 1)) { - Thread.sleep(60000 - (System.currentTimeMillis() - startPollingTime)); } - } catch (InterruptedException ignored) {} + } catch(InterruptedException ignored) {} } - - return Result.success(); - } - private void sendNotification(List notificationThreads) { + private void startPolling() { + for(UserAccount userAccount : userAccounts.keySet()) { + Map userAccountParameters = userAccounts.get(userAccount); - int summaryId = 0; - PendingIntent pendingIntent = getPendingIntent(); + try { + Call> call = RetrofitClient + .getApiInterface(context, userAccount.getInstanceUrl()) + .getNotificationThreads(Authorization.get(userAccount), false, new String[]{"unread"}, + userAccountParameters.get("previousTimestamp"), null, 1, Integer.MAX_VALUE); + + Response> response = call.execute(); + + if(response.code() == 200 && response.body() != null) { + List notificationThreads = response.body(); + if(!notificationThreads.isEmpty()) { + sendNotifications(userAccount, notificationThreads); + } + userAccountParameters.put("previousTimestamp", AppUtil.getTimestampFromDate(context, new Date())); + } + } catch(Exception ignored) {} + } + } + + private void sendNotifications(@NonNull UserAccount userAccount, @NonNull List notificationThreads) { + + PendingIntent pendingIntent = getPendingIntent(userAccount); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); - Notification summaryNotification = new NotificationCompat.Builder(context, context.getPackageName()) - .setContentTitle(context.getString(R.string.newMessages)) + Notification summaryNotification = new NotificationCompat.Builder(context, Constants.mainNotificationChannelId) + .setContentTitle(context.getString(R.string.newMessages, userAccount.getUserName())) .setContentText(String.format(context.getString(R.string.youHaveGotNewNotifications), notificationThreads.size())) .setSmallIcon(R.drawable.gitnex_transparent) - .setGroup(context.getPackageName()) + .setGroup(userAccount.getUserName()) .setGroupSummary(true) .setAutoCancel(true) .setContentIntent(pendingIntent) - .setChannelId(Constants.mainNotificationChannelId) .build(); - notificationManagerCompat.notify(summaryId, summaryNotification); + notificationManagerCompat.notify(userAccount.getAccountId(), summaryNotification); for(NotificationThread notificationThread : notificationThreads) { @@ -119,7 +140,7 @@ public class NotificationsWorker extends Worker { NotificationCompat.Builder builder1 = getBaseNotificationBuilder() .setContentTitle(notificationHeader) - .setGroup(context.getPackageName()) + .setGroup(userAccount.getUserName()) .setContentIntent(pendingIntent); notificationManagerCompat.notify(Notifications.uniqueNotificationId(context), builder1.build()); @@ -129,21 +150,19 @@ public class NotificationsWorker extends Worker { private NotificationCompat.Builder getBaseNotificationBuilder() { - NotificationCompat.Builder builder = new NotificationCompat.Builder(context, context.getPackageName()) + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, Constants.mainNotificationChannelId) .setSmallIcon(R.drawable.gitnex_transparent) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .setChannelId(Constants.mainNotificationChannelId) .setAutoCancel(true); if(tinyDB.getBoolean("notificationsEnableLights", true)) { - builder.setLights(tinyDB.getInt("notificationsLightColor", Color.GREEN), 1500, 1500); } if(tinyDB.getBoolean("notificationsEnableVibration", true)) { - builder.setVibrate(new long[]{ 1000, 1000 }); + builder.setVibrate(Constants.defaultVibrationPattern); } else { builder.setVibrate(null); } @@ -151,13 +170,16 @@ public class NotificationsWorker extends Worker { return builder; } - private PendingIntent getPendingIntent() { + private PendingIntent getPendingIntent(@NonNull UserAccount userAccount) { Intent intent = new Intent(context, MainActivity.class); + intent.putExtra("launchFragment", "notifications"); + intent.putExtra("switchAccountId", userAccount.getAccountId()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - return PendingIntent.getActivity(context, 0, intent, 0); + return PendingIntent.getActivity(context, userAccount.getAccountId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); } + } diff --git a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml index ab0394e0..218adf7d 100644 --- a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml +++ b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml @@ -26,6 +26,9 @@ android:layout_marginLeft="15dp" android:gravity="center_vertical" android:contentDescription="@string/close" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:focusable="true" + android:clickable="true" android:src="@drawable/ic_close" /> @@ -56,11 +61,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/repoSettingsEditProperties" + android:background="?android:attr/selectableItemBackground" android:drawablePadding="32dp" + android:padding="16dp" + android:focusable="true" + android:clickable="true" + android:text="@string/repoSettingsEditProperties" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="16dp" app:drawableStartCompat="@drawable/ic_edit" /> + android:focusable="true" + android:clickable="true" + android:visibility="gone" + tools:visibility="visible"> + android:textSize="12sp" /> + android:textSize="12sp" /> diff --git a/app/src/main/res/layout/activity_settings_appearance.xml b/app/src/main/res/layout/activity_settings_appearance.xml index 1b9f7c06..455379f5 100644 --- a/app/src/main/res/layout/activity_settings_appearance.xml +++ b/app/src/main/res/layout/activity_settings_appearance.xml @@ -10,6 +10,7 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="10dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -47,29 +51,32 @@ android:id="@+id/themeSelectionFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="10dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:orientation="vertical" + android:focusable="true" + android:clickable="true" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -77,29 +84,32 @@ android:id="@+id/customFontFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -107,29 +117,32 @@ android:id="@+id/timeFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -137,30 +150,31 @@ android:id="@+id/counterBadgeFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> diff --git a/app/src/main/res/layout/activity_settings_drafts.xml b/app/src/main/res/layout/activity_settings_drafts.xml index dcb6eb7e..25f3d41b 100644 --- a/app/src/main/res/layout/activity_settings_drafts.xml +++ b/app/src/main/res/layout/activity_settings_drafts.xml @@ -1,16 +1,15 @@ - + android:background="?attr/primaryBackgroundColor" + android:orientation="vertical"> @@ -48,42 +50,41 @@ android:id="@+id/enableDraftsCommentsDeletion" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> + android:textColor="?attr/hintColor" + android:textSize="12sp" /> diff --git a/app/src/main/res/layout/activity_settings_general.xml b/app/src/main/res/layout/activity_settings_general.xml index e48baa40..d7a6e2f1 100644 --- a/app/src/main/res/layout/activity_settings_general.xml +++ b/app/src/main/res/layout/activity_settings_general.xml @@ -1,16 +1,15 @@ - + android:background="?attr/primaryBackgroundColor" + android:orientation="vertical"> @@ -48,40 +50,41 @@ android:id="@+id/setDefaultLinkHandler" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/hintColor" + android:textSize="12sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -89,29 +92,32 @@ android:id="@+id/homeScreenFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_settings_notifications.xml b/app/src/main/res/layout/activity_settings_notifications.xml index 404246f3..e7216c3e 100644 --- a/app/src/main/res/layout/activity_settings_notifications.xml +++ b/app/src/main/res/layout/activity_settings_notifications.xml @@ -1,18 +1,17 @@ - + android:background="?attr/primaryBackgroundColor" + android:orientation="vertical"> @@ -51,8 +53,9 @@ android:id="@+id/enableNotificationsFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:switchMinWidth="56dp" /> @@ -82,29 +85,32 @@ android:id="@+id/pollingDelayFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="10dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -112,30 +118,31 @@ android:id="@+id/enableLightsFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> @@ -143,24 +150,25 @@ android:id="@+id/chooseColorFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> diff --git a/app/src/main/res/layout/activity_settings_reports.xml b/app/src/main/res/layout/activity_settings_reports.xml index f60fe70b..af55301b 100644 --- a/app/src/main/res/layout/activity_settings_reports.xml +++ b/app/src/main/res/layout/activity_settings_reports.xml @@ -1,16 +1,15 @@ - + android:background="?attr/primaryBackgroundColor" + android:orientation="vertical"> @@ -47,31 +49,31 @@ android:id="@+id/enableSendReports" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> diff --git a/app/src/main/res/layout/activity_settings_security.xml b/app/src/main/res/layout/activity_settings_security.xml index 17a76f0a..c4357b99 100644 --- a/app/src/main/res/layout/activity_settings_security.xml +++ b/app/src/main/res/layout/activity_settings_security.xml @@ -1,16 +1,15 @@ - + android:background="?attr/primaryBackgroundColor" + android:orientation="vertical"> @@ -47,30 +49,31 @@ android:id="@+id/biometricFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:switchMinWidth="56dp" /> @@ -78,19 +81,22 @@ android:id="@+id/certsFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> @@ -98,29 +104,32 @@ android:id="@+id/cacheSizeDataSelectionFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -128,29 +137,32 @@ android:id="@+id/cacheSizeImagesSelectionFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> @@ -158,29 +170,32 @@ android:id="@+id/clearCacheSelectionFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_settings_translation.xml b/app/src/main/res/layout/activity_settings_translation.xml index 8deae560..c9b1512e 100644 --- a/app/src/main/res/layout/activity_settings_translation.xml +++ b/app/src/main/res/layout/activity_settings_translation.xml @@ -10,6 +10,7 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="10dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -46,41 +50,44 @@ android:id="@+id/langFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="10dp" - android:orientation="vertical"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textColor="?attr/primaryTextColor" + android:textSize="16sp" /> + android:textColor="?attr/selectedTextColor" + android:textSize="14sp" /> + android:textColor="@color/lightBlue" + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/bottom_sheet_admin_users.xml b/app/src/main/res/layout/bottom_sheet_admin_users.xml index 18d79744..acc6473c 100644 --- a/app/src/main/res/layout/bottom_sheet_admin_users.xml +++ b/app/src/main/res/layout/bottom_sheet_admin_users.xml @@ -15,19 +15,22 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> diff --git a/app/src/main/res/layout/bottom_sheet_drafts.xml b/app/src/main/res/layout/bottom_sheet_drafts.xml index 4d76f557..1ab7ece5 100644 --- a/app/src/main/res/layout/bottom_sheet_drafts.xml +++ b/app/src/main/res/layout/bottom_sheet_drafts.xml @@ -15,19 +15,22 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> diff --git a/app/src/main/res/layout/bottom_sheet_file_viewer.xml b/app/src/main/res/layout/bottom_sheet_file_viewer.xml index 30cbcd48..a3390604 100644 --- a/app/src/main/res/layout/bottom_sheet_file_viewer.xml +++ b/app/src/main/res/layout/bottom_sheet_file_viewer.xml @@ -23,9 +23,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/editFile" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" android:padding="12dp" + android:text="@string/editFile" android:textColor="?attr/primaryTextColor" android:textSize="16sp" app:drawableStartCompat="@drawable/ic_edit" /> @@ -35,9 +38,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/deleteFile" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" android:padding="12dp" + android:text="@string/deleteFile" android:textColor="?attr/primaryTextColor" android:textSize="16sp" app:drawableStartCompat="@drawable/ic_delete" /> @@ -47,11 +53,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/downloadFile" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/downloadFile" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_download" /> diff --git a/app/src/main/res/layout/bottom_sheet_issue_comments.xml b/app/src/main/res/layout/bottom_sheet_issue_comments.xml index c7ad7a76..d49a94b1 100644 --- a/app/src/main/res/layout/bottom_sheet_issue_comments.xml +++ b/app/src/main/res/layout/bottom_sheet_issue_comments.xml @@ -30,11 +30,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/menuEditText" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/menuEditText" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_edit" /> diff --git a/app/src/main/res/layout/bottom_sheet_issues_filter.xml b/app/src/main/res/layout/bottom_sheet_issues_filter.xml index a89de021..81f9b081 100644 --- a/app/src/main/res/layout/bottom_sheet_issues_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_issues_filter.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/isOpen" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/isOpen" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_issue" /> diff --git a/app/src/main/res/layout/bottom_sheet_labels_in_list.xml b/app/src/main/res/layout/bottom_sheet_labels_in_list.xml index e9e78677..002e586d 100644 --- a/app/src/main/res/layout/bottom_sheet_labels_in_list.xml +++ b/app/src/main/res/layout/bottom_sheet_labels_in_list.xml @@ -22,10 +22,10 @@ android:id="@+id/bottomSheetHeader" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/labelName" android:paddingStart="18dp" android:paddingEnd="18dp" android:paddingBottom="18dp" + android:text="@string/labelName" android:textColor="?attr/primaryTextColor" android:textSize="18sp" /> @@ -41,11 +41,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/labelMenuEdit" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/labelMenuEdit" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_edit" /> diff --git a/app/src/main/res/layout/bottom_sheet_milestones_filter.xml b/app/src/main/res/layout/bottom_sheet_milestones_filter.xml index d876482f..4d208a8c 100644 --- a/app/src/main/res/layout/bottom_sheet_milestones_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_milestones_filter.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/isOpen" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/isOpen" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_milestone" /> diff --git a/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml b/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml index 8acacdfb..5f8bcc0f 100644 --- a/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml +++ b/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/closeMilestone" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/closeMilestone" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_close" /> diff --git a/app/src/main/res/layout/bottom_sheet_notifications.xml b/app/src/main/res/layout/bottom_sheet_notifications.xml index f22ab13f..adadfdda 100644 --- a/app/src/main/res/layout/bottom_sheet_notifications.xml +++ b/app/src/main/res/layout/bottom_sheet_notifications.xml @@ -23,11 +23,14 @@ android:background="?attr/primaryBackgroundColor"> android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/pinNotification" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/pinNotification" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_pin" /> android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/markAsRead" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/markAsRead" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_unwatch" /> android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/markAsUnread" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/markAsUnread" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_watchers" /> diff --git a/app/src/main/res/layout/bottom_sheet_notifications_filter.xml b/app/src/main/res/layout/bottom_sheet_notifications_filter.xml index 2ac0a503..42f13c43 100644 --- a/app/src/main/res/layout/bottom_sheet_notifications_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_notifications_filter.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/isUnread" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/isUnread" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_watchers" /> diff --git a/app/src/main/res/layout/bottom_sheet_organization.xml b/app/src/main/res/layout/bottom_sheet_organization.xml index da44ef12..e4bbef2e 100644 --- a/app/src/main/res/layout/bottom_sheet_organization.xml +++ b/app/src/main/res/layout/bottom_sheet_organization.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/createRepository" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/createRepository" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_repo" /> diff --git a/app/src/main/res/layout/bottom_sheet_organization_teams.xml b/app/src/main/res/layout/bottom_sheet_organization_teams.xml index 003f7f2e..ea60c3ee 100644 --- a/app/src/main/res/layout/bottom_sheet_organization_teams.xml +++ b/app/src/main/res/layout/bottom_sheet_organization_teams.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/addNewMember" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/addNewMember" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_person_add" /> diff --git a/app/src/main/res/layout/bottom_sheet_profile.xml b/app/src/main/res/layout/bottom_sheet_profile.xml index 27d7ba80..0ef6cafd 100644 --- a/app/src/main/res/layout/bottom_sheet_profile.xml +++ b/app/src/main/res/layout/bottom_sheet_profile.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/profileCreateNewEmailAddress" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/profileCreateNewEmailAddress" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_email" /> diff --git a/app/src/main/res/layout/bottom_sheet_pull_request_filter.xml b/app/src/main/res/layout/bottom_sheet_pull_request_filter.xml index 10c06915..80d67320 100644 --- a/app/src/main/res/layout/bottom_sheet_pull_request_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_pull_request_filter.xml @@ -23,11 +23,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/isOpen" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/isOpen" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_pull_request" /> diff --git a/app/src/main/res/layout/bottom_sheet_reply_layout.xml b/app/src/main/res/layout/bottom_sheet_reply_layout.xml index a07f4b76..47e74c5a 100644 --- a/app/src/main/res/layout/bottom_sheet_reply_layout.xml +++ b/app/src/main/res/layout/bottom_sheet_reply_layout.xml @@ -31,8 +31,10 @@ android:layout_height="26dp" android:layout_marginEnd="15dp" android:layout_weight="0" - android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/close" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:focusable="true" + android:clickable="true" android:src="@drawable/ic_close" /> @@ -63,6 +67,8 @@ android:layout_weight="0" android:alpha=".5" android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:contentDescription="@string/close" android:enabled="false" android:src="@drawable/ic_send" /> diff --git a/app/src/main/res/layout/bottom_sheet_repo.xml b/app/src/main/res/layout/bottom_sheet_repo.xml index 0b50ed57..e07f4494 100644 --- a/app/src/main/res/layout/bottom_sheet_repo.xml +++ b/app/src/main/res/layout/bottom_sheet_repo.xml @@ -23,6 +23,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" android:padding="12dp" android:text="@string/pageTitleNewFile" @@ -35,6 +38,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" android:padding="12dp" android:text="@string/pageTitleCreateNewIssue" @@ -47,6 +53,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" android:padding="12dp" android:text="@string/pageTitleNewPullRequest" @@ -59,11 +68,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:text="@string/pageTitleCreateMilestone" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:drawablePadding="24dp" + android:padding="12dp" + android:text="@string/pageTitleCreateMilestone" android:textColor="?attr/primaryTextColor" android:textSize="16sp" - android:padding="12dp" app:drawableStartCompat="@drawable/ic_milestone" /> diff --git a/app/src/main/res/layout/bottom_sheet_single_issue.xml b/app/src/main/res/layout/bottom_sheet_single_issue.xml index be79900d..3eb32ac8 100644 --- a/app/src/main/res/layout/bottom_sheet_single_issue.xml +++ b/app/src/main/res/layout/bottom_sheet_single_issue.xml @@ -2,6 +2,7 @@ + app:drawableStartCompat="@drawable/ic_file" + tools:visibility="visible" /> + app:drawableStartCompat="@drawable/ic_watchers" + tools:visibility="visible" /> + app:drawableStartCompat="@drawable/ic_reopen" + tools:visibility="visible" /> diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 919ccfb2..26242e15 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -94,17 +94,18 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:theme="@style/AppTheme.AppBarOverlay"> + android:theme="@style/AppTheme.AppBarOverlay" + app:elevation="0dp"> + app:tabMode="scrollable" + app:tabTextAppearance="@style/customTabLayout" + app:tabTextColor="?attr/primaryTextColor"> @@ -124,6 +127,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:focusable="true" + android:clickable="true" android:gravity="center" android:orientation="vertical"> @@ -146,6 +152,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:focusable="true" + android:clickable="true" android:gravity="center" android:orientation="vertical"> @@ -168,6 +177,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:focusable="true" + android:clickable="true" android:gravity="center" android:orientation="vertical"> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index f8db344e..3bb79988 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -14,15 +14,20 @@ + android:paddingTop="10dp"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" + android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> @@ -149,8 +166,12 @@ android:id="@+id/notificationsFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="25dp" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:orientation="vertical" + android:paddingTop="10dp" + android:paddingBottom="10dp" android:visibility="gone"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> @@ -214,8 +239,12 @@ android:id="@+id/reportsFrame" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:orientation="vertical" - android:layout_marginTop="25dp"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> @@ -246,29 +275,33 @@ android:id="@+id/rateAppFrame" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:orientation="vertical" - android:layout_marginTop="25dp"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> + android:textSize="16sp" + app:drawableStartCompat="@drawable/ic_like" /> @@ -278,9 +311,12 @@ android:id="@+id/aboutAppFrame" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" + android:clickable="true" android:orientation="vertical" - android:layout_marginTop="25dp" - android:layout_marginBottom="20dp"> + android:paddingTop="10dp" + android:paddingBottom="10dp"> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 4028af15..2c020a03 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -560,7 +560,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3677477e..c638328d 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c3e6a14b..656eaf4b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -557,7 +557,7 @@ Aktiviere Hell Vibration aktivieren Farbe auswählen - Neue Nachrichten + Neue Nachrichten für %s Du hast %d neue Nachrichten. Benachrichtigungen Das ist der Haupt-Nachrichten-Kanal von GitNex. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ec58669c..76baacae 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index dc713a4b..388cd82a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -560,7 +560,7 @@ Enable Light فعال‌سازی لرزش انتخاب رنگ - پیام‌های جدید + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d048fea1..c3f7152b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e1c761e4..c3b65c07 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -557,7 +557,7 @@ Activer le témoin lumineux Activer le vibreur Couleur - Nouveaux messages + New messages for %s Vous avez %d nouvelles notifications. Notifications Le canal de notifications principal de GitNex. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 759066f6..d18f43f1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -69,7 +69,7 @@ Impossibile connettersi all\'host. Controlla l\'URL o la porta per eventuali errori Non si consiglia di utilizzare il protocollo HTTP a meno che non si stia testando sulla rete locale Malformed JSON was received. Server response was not successful - Istanza + Istanza URL è richiesto Nome utente obbligatorio Password obbligatoria @@ -274,7 +274,7 @@ URL è richiesto I membri possono inviare i repository del team e aggiungere loro collaboratori Inserisci il nome del team Il nome del team deve contenere solo caratteri alfanumerici, trattino (-), trattino basso (_) e punto (.) - Seleziona + Seleziona autorizzazione La descrizione del team contiene caratteri non validi La descrizione del team ha più di 100 caratteri @@ -559,7 +559,7 @@ autorizzazione Enable Light Abilita la vibrazione Scegli il colore - Nuovi messaggi + New messages for %s You\'ve got %d new notifications. Notifiche This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 03dbc7b9..ce82af3d 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1cb1ba72..6386d7ec 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0aa71eb1..5065a939 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fc331922..d9e966a9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 2bccf393..ea36fd71 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 68cb0dd0..ac37f103 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8b1c8fe7..d7ec89f8 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -557,7 +557,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 50b34cf4..172aa989 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -557,7 +557,7 @@ 启用 Light 启用振动 选择颜色 - 新消息 + New messages for %s 您有%d条新通知 通知 这是 GitNex 的主通知通道。 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3a85e05f..7eb2c893 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -57,5 +57,6 @@ #050505 #d2d2d2 + #0E0E0E #151515 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a5401f5..16639cc6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -673,7 +673,7 @@ Enable Light Enable Vibration Choose Color - New messages + New messages for %s You\'ve got %d new notifications. Notifications This is the main notification channel of GitNex. diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 58880a3f..d782d482 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -150,7 +150,7 @@ @style/AppThemeDarkSearchAutoCompleteTextView @color/hintColor @color/darkGreen - @color/hintColor + @color/pitchBlackThemeDividerColor @style/AppThemeDarkBottomSheetDialog @style/AppSearchViewStyle @color/darkGreen diff --git a/gradle.properties b/gradle.properties index ed7c758a..a43d4a12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,7 @@ android.enableJetifier=true android.useAndroidX=true org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.workers.max=12 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects