From 758ee59a44bd8c3f3c61ba289c693ee1d0167e6d Mon Sep 17 00:00:00 2001 From: M M Arif Date: Sun, 1 Oct 2023 20:53:17 +0500 Subject: [PATCH] Redesign create repo screen, add default branch, issue labels and license options --- app/src/main/AndroidManifest.xml | 8 +- .../gitnex/activities/CreateRepoActivity.java | 237 ++++++++++-------- .../main/res/layout/activity_create_repo.xml | 154 ++++++++---- .../main/res/layout/fragment_repo_info.xml | 19 +- app/src/main/res/values/settings.xml | 180 +++++++++++++ app/src/main/res/values/strings.xml | 8 +- 6 files changed, 438 insertions(+), 168 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 005a9b3d..67243bc4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -104,7 +104,8 @@ android:theme="@android:style/Theme.NoTitleBar"/> + android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation" + android:windowSoftInputMode="adjustResize"/> @@ -148,7 +149,8 @@ android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation"/> + android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation" + android:windowSoftInputMode="adjustResize"/> @@ -168,7 +170,7 @@ + android:windowSoftInputMode="adjustResize"/> reservedRepoNames = Arrays.asList(".", ".."); final Pattern reservedRepoPatterns = Pattern.compile("\\.(git|wiki)$"); - public ImageView closeActivity; List organizationsList = new ArrayList<>(); - private View.OnClickListener onClickListener; - private AutoCompleteTextView spinner; - private Button createRepo; - private EditText repoName; - private EditText repoDesc; - private CheckBox repoAccess; + List issueLabelsList = new ArrayList<>(); + List licenseList = new ArrayList<>(); + private ActivityCreateRepoBinding activityCreateRepoBinding; private String loginUid; private String selectedOwner; - private final View.OnClickListener createRepoListener = v -> processNewRepo(); + private String selectedIssueLabels; + private String selectedLicense; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityCreateRepoBinding activityCreateRepoBinding = - ActivityCreateRepoBinding.inflate(getLayoutInflater()); + activityCreateRepoBinding = ActivityCreateRepoBinding.inflate(getLayoutInflater()); setContentView(activityCreateRepoBinding.getRoot()); - boolean connToInternet = AppUtil.hasNetworkConnection(ctx); - loginUid = getAccount().getAccount().getUserName(); - - InputMethodManager imm = - (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - - closeActivity = activityCreateRepoBinding.close; - repoName = activityCreateRepoBinding.newRepoName; - repoDesc = activityCreateRepoBinding.newRepoDescription; - repoAccess = activityCreateRepoBinding.newRepoPrivate; - - repoName.requestFocus(); - assert imm != null; - imm.showSoftInput(repoName, InputMethodManager.SHOW_IMPLICIT); - - initCloseListener(); - closeActivity.setOnClickListener(onClickListener); - - spinner = activityCreateRepoBinding.ownerSpinner; getOrganizations(loginUid); - createRepo = activityCreateRepoBinding.createNewRepoButton; - disableProcessButton(); + activityCreateRepoBinding.topAppBar.setNavigationOnClickListener(v -> finish()); - if (!connToInternet) { + MenuItem attachment = activityCreateRepoBinding.topAppBar.getMenu().getItem(0); + attachment.setVisible(false); + MenuItem markdown = activityCreateRepoBinding.topAppBar.getMenu().getItem(1); + markdown.setVisible(false); - disableProcessButton(); - } else { + String[] licenses = getResources().getStringArray(R.array.licenses); + Collections.addAll(licenseList, licenses); + getLicenses(); - createRepo.setOnClickListener(createRepoListener); - } + issueLabelsList.add(getString(R.string.advanced)); + issueLabelsList.add(getString(R.string.defaultText)); + getIssueLabels(); + + activityCreateRepoBinding.topAppBar.setOnMenuItemClickListener( + menuItem -> { + int id = menuItem.getItemId(); + + if (id == R.id.create) { + processNewRepo(); + return true; + } else { + return super.onOptionsItemSelected(menuItem); + } + }); } private void processNewRepo() { - boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - - String newRepoName = repoName.getText().toString(); - String newRepoDesc = repoDesc.getText().toString(); - boolean newRepoAccess = repoAccess.isChecked(); - - if (!connToInternet) { - - Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); - return; - } + String newRepoName = + Objects.requireNonNull(activityCreateRepoBinding.newRepoName.getText()).toString(); + String newRepoDesc = + Objects.requireNonNull(activityCreateRepoBinding.newRepoDescription.getText()) + .toString(); + boolean newRepoAccess = activityCreateRepoBinding.newRepoPrivate.isChecked(); + boolean repoAsTemplate = activityCreateRepoBinding.setAsTemplate.isChecked(); + String defaultBranch = + Objects.requireNonNull(activityCreateRepoBinding.defaultBranch.getText()) + .toString(); if (!newRepoDesc.equals("")) { if (newRepoDesc.length() > 255) { - Toasty.warning(ctx, getString(R.string.repoDescError)); + SnackBar.error( + ctx, findViewById(android.R.id.content), getString(R.string.repoDescError)); return; } } if (newRepoName.equals("")) { - Toasty.error(ctx, getString(R.string.repoNameErrorEmpty)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoNameErrorEmpty)); } else if (!AppUtil.checkStrings(newRepoName)) { - Toasty.warning(ctx, getString(R.string.repoNameErrorInvalid)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoNameErrorInvalid)); } else if (reservedRepoNames.contains(newRepoName)) { - Toasty.warning(ctx, getString(R.string.repoNameErrorReservedName)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoNameErrorReservedName)); } else if (reservedRepoPatterns.matcher(newRepoName).find()) { - Toasty.warning(ctx, getString(R.string.repoNameErrorReservedPatterns)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoNameErrorReservedPatterns)); + } else if (defaultBranch.equalsIgnoreCase("")) { + + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoDefaultBranchError)); } else if (selectedOwner == null) { - Toasty.error(ctx, getString(R.string.repoOwnerError)); + SnackBar.error( + ctx, findViewById(android.R.id.content), getString(R.string.repoOwnerError)); } else { - disableProcessButton(); - createNewRepository(loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess); + createNewRepository( + loginUid, + newRepoName, + newRepoDesc, + selectedOwner, + newRepoAccess, + defaultBranch, + repoAsTemplate); } } @@ -143,7 +155,9 @@ public class CreateRepoActivity extends BaseActivity { String repoName, String repoDesc, String selectedOwner, - boolean isPrivate) { + boolean isPrivate, + String defaultBranch, + boolean repoAsTemplate) { CreateRepoOption createRepository = new CreateRepoOption(); createRepository.setAutoInit(true); @@ -151,6 +165,10 @@ public class CreateRepoActivity extends BaseActivity { createRepository.setPrivate(isPrivate); createRepository.setReadme("Default"); createRepository.setName(repoName); + createRepository.setDefaultBranch(defaultBranch); + createRepository.setIssueLabels(selectedIssueLabels); + createRepository.setTemplate(repoAsTemplate); + createRepository.setLicense(selectedLicense); Call call; if (selectedOwner.equals(loginUid)) { @@ -164,7 +182,7 @@ public class CreateRepoActivity extends BaseActivity { } call.enqueue( - new Callback() { + new Callback<>() { @Override public void onResponse( @@ -175,40 +193,68 @@ public class CreateRepoActivity extends BaseActivity { MainActivity.reloadRepos = true; OrganizationDetailActivity.updateOrgFABActions = true; - Toasty.success(ctx, getString(R.string.repoCreated)); - enableProcessButton(); - finish(); + + SnackBar.success( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoCreated)); + + new Handler().postDelayed(() -> finish(), 3000); } else if (response.code() == 401) { - enableProcessButton(); AlertDialogs.authorizationTokenRevokedDialog(ctx); } else if (response.code() == 409) { - enableProcessButton(); - Toasty.warning(ctx, getString(R.string.repoExistsError)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.repoExistsError)); } else { - enableProcessButton(); - Toasty.error(ctx, getString(R.string.genericError)); + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.genericError)); } } @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - Log.e("onFailure", t.toString()); - enableProcessButton(); - } + public void onFailure(@NonNull Call call, @NonNull Throwable t) {} }); } + private void getIssueLabels() { + + ArrayAdapter adapter = + new ArrayAdapter<>( + CreateRepoActivity.this, R.layout.list_spinner_items, issueLabelsList); + + activityCreateRepoBinding.issueLabels.setAdapter(adapter); + + activityCreateRepoBinding.issueLabels.setOnItemClickListener( + (parent, view, position, id) -> + selectedIssueLabels = issueLabelsList.get(position)); + } + + private void getLicenses() { + + ArrayAdapter adapter = + new ArrayAdapter<>( + CreateRepoActivity.this, R.layout.list_spinner_items, licenseList); + + activityCreateRepoBinding.licenses.setAdapter(adapter); + + activityCreateRepoBinding.licenses.setOnItemClickListener( + (parent, view, position, id) -> selectedLicense = licenseList.get(position)); + } + private void getOrganizations(final String userLogin) { Call> call = RetrofitClient.getApiInterface(ctx).orgListCurrentUserOrgs(1, 50); call.enqueue( - new Callback>() { + new Callback<>() { @Override public void onResponse( @@ -247,9 +293,9 @@ public class CreateRepoActivity extends BaseActivity { R.layout.list_spinner_items, organizationsList); - spinner.setAdapter(adapter); + activityCreateRepoBinding.ownerSpinner.setAdapter(adapter); - spinner.setOnItemClickListener( + activityCreateRepoBinding.ownerSpinner.setOnItemClickListener( (parent, view, position, id) -> selectedOwner = organizationsList.get(position)); @@ -260,7 +306,7 @@ public class CreateRepoActivity extends BaseActivity { new Handler(Looper.getMainLooper()) .postDelayed( () -> { - spinner.setText( + activityCreateRepoBinding.ownerSpinner.setText( organizationsList.get(selectOwnerById), false); selectedOwner = @@ -270,36 +316,15 @@ public class CreateRepoActivity extends BaseActivity { getIntent().removeExtra("organizationAction"); } - enableProcessButton(); } else if (response.code() == 401) { - enableProcessButton(); AlertDialogs.authorizationTokenRevokedDialog(ctx); } } @Override public void onFailure( - @NonNull Call> call, @NonNull Throwable t) { - - Log.e("onFailure", t.toString()); - enableProcessButton(); - } + @NonNull Call> call, @NonNull Throwable t) {} }); } - - private void initCloseListener() { - - onClickListener = view -> finish(); - } - - private void disableProcessButton() { - - createRepo.setEnabled(false); - } - - private void enableProcessButton() { - - createRepo.setEnabled(true); - } } diff --git a/app/src/main/res/layout/activity_create_repo.xml b/app/src/main/res/layout/activity_create_repo.xml index e82d1fdd..471e0a3b 100644 --- a/app/src/main/res/layout/activity_create_repo.xml +++ b/app/src/main/res/layout/activity_create_repo.xml @@ -1,55 +1,43 @@ - + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:background="?attr/primaryBackgroundColor" + android:fitsSystemWindows="true"> - + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" + app:contentScrim="?attr/primaryBackgroundColor" + android:layout_height="?attr/collapsingToolbarLayoutLargeSize"> - + - - - + - + app:layout_behavior="@string/appbar_scrolling_view_behavior"> @@ -77,7 +64,7 @@ android:inputType="none" android:labelFor="@+id/ownerSpinner" android:textColor="?attr/inputTextColor" - android:textSize="@dimen/dimen16sp"/> + android:textSize="@dimen/dimen16sp" /> @@ -89,7 +76,6 @@ android:layout_marginBottom="@dimen/dimen8dp" android:hint="@string/newRepoTintCopy" android:textColorHint="?attr/hintColor" - app:boxBackgroundColor="?attr/inputBackgroundColor" app:boxStrokeErrorColor="@color/darkRed" app:endIconMode="clear_text" app:endIconTint="?attr/iconsColor" @@ -107,6 +93,55 @@ + + + + + + + + + + + + + + + + + + - + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dimen10dp" + android:checked="false" + android:text="@string/setAsTemplate" + android:textColor="?attr/primaryTextColor" + android:textSize="@dimen/dimen16sp" /> - + - + diff --git a/app/src/main/res/layout/fragment_repo_info.xml b/app/src/main/res/layout/fragment_repo_info.xml index 8a0a6765..5193414f 100644 --- a/app/src/main/res/layout/fragment_repo_info.xml +++ b/app/src/main/res/layout/fragment_repo_info.xml @@ -204,6 +204,15 @@ app:icon="@drawable/ic_watchers" android:text="@string/repoStars" /> +