diff --git a/app/src/main/java/net/osmtracker/GitHubUser.java b/app/src/main/java/net/osmtracker/GitHubUser.java index d1e387e31..e6ce5b5cf 100644 --- a/app/src/main/java/net/osmtracker/GitHubUser.java +++ b/app/src/main/java/net/osmtracker/GitHubUser.java @@ -1,33 +1,30 @@ package net.osmtracker; +import net.osmtracker.github.*; + import android.content.Context; import android.content.SharedPreferences; public class GitHubUser { - - private static final String PREF_NAME = "GitHubPrefs"; - private static final String KEY_USERNAME = "username"; - private static final String KEY_TOKEN = "token"; - private SharedPreferences sharedPreferences; public GitHubUser(Context context) { - sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + sharedPreferences = context.getSharedPreferences(GitHubConstants.SHARED_PREFS_NAME, Context.MODE_PRIVATE); } public void saveCredentials(String username, String token) { sharedPreferences.edit() - .putString(KEY_USERNAME, username) - .putString(KEY_TOKEN, token) + .putString(GitHubConstants.KEY_USERNAME, username) + .putString(GitHubConstants.KEY_TOKEN, token) .apply(); } public String getUsername() { - return sharedPreferences.getString(KEY_USERNAME, ""); + return sharedPreferences.getString(GitHubConstants.KEY_USERNAME, ""); } public String getToken() { - return sharedPreferences.getString(KEY_TOKEN, ""); + return sharedPreferences.getString(GitHubConstants.KEY_TOKEN, ""); } public boolean hasCredentials() { diff --git a/app/src/main/java/net/osmtracker/activity/GitHubConfig.java b/app/src/main/java/net/osmtracker/activity/GitHubConfig.java index d094d0516..3514f1211 100644 --- a/app/src/main/java/net/osmtracker/activity/GitHubConfig.java +++ b/app/src/main/java/net/osmtracker/activity/GitHubConfig.java @@ -14,11 +14,9 @@ import net.osmtracker.GitHubUser; import net.osmtracker.R; +import static net.osmtracker.github.GitHubConstants.GITHUB_TOKENS_URL; public class GitHubConfig extends Activity { - - private final static String GitHubToken_URL = "https://github.com/settings/tokens"; - EditText editTextUserName, editTextUserToken; private GitHubUser gitHubUser; @@ -37,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(GitHubToken_URL)); + intent.setData(Uri.parse(GITHUB_TOKENS_URL)); startActivity(intent); } }); @@ -49,12 +47,15 @@ public void onClick(View v) { String username = editTextUserName.getText().toString().trim(); String ghToken = editTextUserToken.getText().toString().trim(); + // Empty is enabled to allow saving without credentials to erase the existing ones + /* if (username.isEmpty()) { editTextUserName.setError("Username required"); return; } - if (ghToken.length() != 40) { - editTextUserToken.setError("Token must be 40 characters"); + */ + if (ghToken.length() != 40 && !ghToken.isEmpty()) { + editTextUserToken.setError(getString(R.string.error_gh_token_lenght)); return; } diff --git a/app/src/main/java/net/osmtracker/activity/GitHubNewFork.java b/app/src/main/java/net/osmtracker/activity/GitHubNewFork.java index bf8d6d551..e6ffa4e1f 100644 --- a/app/src/main/java/net/osmtracker/activity/GitHubNewFork.java +++ b/app/src/main/java/net/osmtracker/activity/GitHubNewFork.java @@ -21,6 +21,7 @@ import net.osmtracker.GitHubUser; import net.osmtracker.R; +import static net.osmtracker.github.GitHubConstants.getRepoForksUrl; import org.json.JSONException; import org.json.JSONObject; @@ -29,9 +30,7 @@ import java.util.Map; public class GitHubNewFork extends Activity { - EditText editTextRootUsername, editTextRootRepo; - private String BaseURL = "https://api.github.com"; private GitHubUser gitHubUser; private String newForkFullName; @@ -69,7 +68,6 @@ public void onClick(View v) { createNewFork(username, repo); //Toast.makeText(GitHubNewFork.this, R.string.successfully_created, Toast.LENGTH_SHORT).show(); //finish(); - } }); @@ -78,7 +76,6 @@ public void onClick(View v) { btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - finish(); } }); @@ -88,7 +85,7 @@ public void onClick(View v) { } private void createNewFork(String username, String repo) { - String fullURL = getBaseURL() + "/repos/"+ username +"/"+ repo +"/forks?name=fork"; + String fullURL = getRepoForksUrl(username, repo); JsonObjectRequest postResquest= new JsonObjectRequest( Request.Method.POST, @@ -119,15 +116,10 @@ public Map getHeaders() throws AuthFailureError headers.put("Authorization", "Bearer " + gitHubUser.getToken()); return headers; } - }; Volley.newRequestQueue(this).add(postResquest); } - public String getBaseURL() { - return BaseURL; - } - public void setNewForkFullName(String newForkFullName) { this.newForkFullName = newForkFullName; } diff --git a/app/src/main/java/net/osmtracker/activity/GitHubNewRepo.java b/app/src/main/java/net/osmtracker/activity/GitHubNewRepo.java index 51f0823c6..4be491618 100644 --- a/app/src/main/java/net/osmtracker/activity/GitHubNewRepo.java +++ b/app/src/main/java/net/osmtracker/activity/GitHubNewRepo.java @@ -22,6 +22,7 @@ import net.osmtracker.GitHubUser; import net.osmtracker.R; +import static net.osmtracker.github.GitHubConstants.GITHUB_API_USER_REPOS_URL; import org.json.JSONException; import org.json.JSONObject; @@ -33,7 +34,6 @@ public class GitHubNewRepo extends Activity { EditText editTextNewRepo; - private String BaseURL = "https://api.github.com"; private GitHubUser gitHubUser; private String newRepoFullName; @@ -77,7 +77,7 @@ public void onClick(View v) { } private void createNewRepo(String repoName, boolean isPrivate) { - String fullURL = getBaseURL()+"/user/repos"; + String fullURL = GITHUB_API_USER_REPOS_URL; ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setMessage(this.getResources().getString(R.string.github_creating_repository)); @@ -140,10 +140,6 @@ public byte[] getBody() { Volley.newRequestQueue(this).add(postResquest); } - public String getBaseURL() { - return BaseURL; - } - public void setNewRepoFullName(String newRepoFullName) { this.newRepoFullName = newRepoFullName; } diff --git a/app/src/main/java/net/osmtracker/activity/GitHubPullRequest.java b/app/src/main/java/net/osmtracker/activity/GitHubPullRequest.java index 80033c1d4..85198674e 100644 --- a/app/src/main/java/net/osmtracker/activity/GitHubPullRequest.java +++ b/app/src/main/java/net/osmtracker/activity/GitHubPullRequest.java @@ -21,7 +21,10 @@ import net.osmtracker.GitHubUser; import net.osmtracker.R; +import static net.osmtracker.github.GitHubConstants.getRepoPullsUrl; +import static net.osmtracker.github.GitHubConstants.getRepoUrl; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -32,9 +35,8 @@ public class GitHubPullRequest extends Activity { EditText editTextTitle, editTextBody; - private String BaseURL = "https://api.github.com"; - private String RepoOrigen; - private String DefaultBranch; + private String repoOrigen; + private String defaultBranch; private GitHubUser gitHubUser; @Override @@ -84,7 +86,7 @@ public void onClick(View v) { } private void createPullRequest() { - String fullURL = getBaseURL()+"/repos/"+getRepoOrigen()+"/pulls"; + String fullURL = getRepoPullsUrl(this.repoOrigen); JsonObjectRequest postResquest= new JsonObjectRequest( Request.Method.POST, @@ -103,14 +105,23 @@ public void onResponse(JSONObject response) { }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - String errorMsg = "Error while creating the PR"; + String errorMsg = ""; if (error.networkResponse != null && error.networkResponse.data != null) { try { String responseBody = new String(error.networkResponse.data, "utf-8"); Log.e("PR_ERROR", responseBody); - errorMsg += "\n" + responseBody; + JSONObject github_response = new JSONObject(responseBody); + JSONArray github_errors = github_response.getJSONArray("errors"); + for (int i = 0; i < github_errors.length(); i++) { + JSONObject github_error = github_errors.getJSONObject(i); + errorMsg += github_error.getString("message") + "\n"; + } } catch (UnsupportedEncodingException e) { e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } finally { + errorMsg += getString(R.string.error_gh_pr_creation); } } Toast.makeText(GitHubPullRequest.this, errorMsg, Toast.LENGTH_LONG).show(); @@ -154,7 +165,7 @@ public byte[] getBody() { } private void getInfoRepo(String repoFullName) { - String fullURL = getBaseURL()+"/repos/"+repoFullName; + String fullURL = getRepoUrl(repoFullName); JsonObjectRequest postResquest= new JsonObjectRequest( Request.Method.GET, @@ -187,23 +198,16 @@ public Map getHeaders() throws AuthFailureError { Volley.newRequestQueue(this).add(postResquest); } - public String getBaseURL() { - return BaseURL; - } - - public String getRepoOrigen() { - return RepoOrigen; - } public void setRepoOrigen(String repoOrigen) { - RepoOrigen = repoOrigen; + this.repoOrigen = repoOrigen; } public String getDefaultBranch() { - return DefaultBranch; + return defaultBranch; } public void setDefaultBranch(String defaultBranch) { - DefaultBranch = defaultBranch; + this.defaultBranch = defaultBranch; } } diff --git a/app/src/main/java/net/osmtracker/activity/GitHubUpload.java b/app/src/main/java/net/osmtracker/activity/GitHubUpload.java index 150adab6f..07f265413 100644 --- a/app/src/main/java/net/osmtracker/activity/GitHubUpload.java +++ b/app/src/main/java/net/osmtracker/activity/GitHubUpload.java @@ -34,6 +34,8 @@ import net.osmtracker.util.Callback; import net.osmtracker.util.DialogUtils; import net.osmtracker.util.GitHubUtils; +import static net.osmtracker.github.GitHubConstants.getRepoFileContentUrl; +import static net.osmtracker.github.GitHubConstants.getUserReposUrl; import org.json.JSONArray; import org.json.JSONException; @@ -50,9 +52,7 @@ public class GitHubUpload extends Activity { - private ArrayList ArrayListRepos; - private String BaseURL = "https://api.github.com"; private GitHubUser gitHubUser; private String RepoName = ""; EditText editTextCommitMsj; @@ -166,7 +166,7 @@ private void openActivityOnClick(int btnId, Class destinatio * Either starts uploading directly if we are authenticated against GitHub */ private void startUploadGitHub(final String fileInBase64, String filename, String commitMsj){ - String fullURL = getBaseURL()+"/repos/"+getRepoName()+"/contents/"+filename; + String fullURL = getRepoFileContentUrl(getRepoName(), filename); ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setMessage(this.getResources().getString(R.string.uploading_file) + filename); @@ -264,15 +264,19 @@ public void onItemSelected(AdapterView adapterView, View view, int i, long l) } @Override public void onNothingSelected(AdapterView adapterView) { - + Toast.makeText(GitHubUpload.this, "R.string.upload_to_github_select_repo", Toast.LENGTH_SHORT).show(); } }); } private void listRepos() { + ProgressDialog progressDialog = new ProgressDialog(this); + progressDialog.setMessage(getString(R.string.retrieving_repositories)); + progressDialog.setCancelable(true); + progressDialog.show(); + RequestQueue queue = Volley.newRequestQueue(this); - String sortBy = "created"; - String fullURL = getBaseURL() + "/user/repos?" + "sort=" + sortBy ; + String fullURL = getUserReposUrl(); JsonArrayRequest getResquest = new JsonArrayRequest( Request.Method.GET, @@ -281,17 +285,7 @@ private void listRepos() { new Response.Listener() { @Override public void onResponse(JSONArray response) { - for (int i = 0; i < response.length(); i++) { - // creating a new json object and - // getting each object from our json array. - try { - JSONObject responseObj = response.getJSONObject(i); - ArrayListRepos.add(responseObj.getString("full_name")); - - } catch (JSONException e) { - e.printStackTrace(); - } - } + listRepoResponseAction(response, progressDialog); } }, new Response.ErrorListener() { @Override @@ -318,6 +312,35 @@ public Map getHeaders() throws AuthFailureError queue.add(getResquest); } + /** + * This method is called when the list of repositories is retrieved + * from the server. + * + * @param response JSONArray with the repositories + * @param progressDialog ProgressDialog + */ + private void listRepoResponseAction(JSONArray response, ProgressDialog progressDialog) { + boolean errorOcurred = false; + for (int i = 0; i < response.length(); i++) { + // creating a new json object and + // getting each object from our json array. + try { + JSONObject responseObj = response.getJSONObject(i); + ArrayListRepos.add(responseObj.getString("full_name")); + } catch (JSONException e) { + progressDialog.dismiss(); + Toast.makeText(GitHubUpload.this, R.string.error_retrieving_repositories, Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + errorOcurred = true; + break; + } + } + if (!errorOcurred) { + Toast.makeText(GitHubUpload.this, R.string.successfully_retrieved_repositories, Toast.LENGTH_SHORT).show(); + progressDialog.dismiss(); + } + } + public String getRepoName() { return RepoName; } @@ -325,9 +348,4 @@ public String getRepoName() { public void setRepoName(String repoName) { RepoName = repoName; } - - public String getBaseURL() { - return BaseURL; - } - } diff --git a/app/src/main/java/net/osmtracker/github/GitHubConstants.java b/app/src/main/java/net/osmtracker/github/GitHubConstants.java new file mode 100644 index 000000000..342c1d925 --- /dev/null +++ b/app/src/main/java/net/osmtracker/github/GitHubConstants.java @@ -0,0 +1,66 @@ +package net.osmtracker.github; + +public final class GitHubConstants { + // Config constans + public static final String SHARED_PREFS_NAME = "GitHubPrefs"; + public static final String KEY_USERNAME = "username"; + public static final String KEY_TOKEN = "token"; + // URL constants + public static String GITHUB_API_URL = "https://api.github.com"; + public static String GITHUB_TOKENS_URL = "https://github.com/settings/tokens"; + public static String GITHUB_API_REPOS_URL = GITHUB_API_URL + "/repos"; + public static String GITHUB_API_USER_URL = GITHUB_API_URL + "/user"; + public static String GITHUB_API_USER_REPOS_URL = GITHUB_API_USER_URL + "/repos"; + + private GitHubConstants() { + // Private constructor to prevent instantiation + } + + //String fullURL = GITHUB_API_URL+"/repos/"+repoFullName; + public static String getRepoUrl(String repoFullName) { + return GITHUB_API_REPOS_URL + "/" + repoFullName; + } + + /** + * Builds the URL to fetch a repository's forks. + * + * @param username The GitHub username. + * @param repo The repository name. + * @return The complete URL for the forks endpoint. + */ + public static String getRepoForksUrl(String username, String repo) { + return GITHUB_API_REPOS_URL + "/" + username + "/" + repo + "/forks"; + } + + /** + * Builds the URL to fetch a repository's pull + * @param repoOrigen The repository name. + * @return The complete URL for the pull requests endpoint. + */ + public static String getRepoPullsUrl(String repoOrigen) { + return GITHUB_API_REPOS_URL + "/" + repoOrigen + "/pulls"; + } + + /** + * Builds the URL to fetch a file's content. + * @param repoOrigen The repository name. + * @param filename The file name. + * @return The complete URL for the file content endpoint. + */ + public static String getRepoFileContentUrl(String repoOrigen, String filename) { + return GITHUB_API_REPOS_URL + "/" + repoOrigen + "/contents/" + filename; + } + + /** + * Builds the URL to fetch a user's repositories with optional sorting. + * @param sortBy The sorting parameter. + * @return The complete URL for the user's repositories endpoint. + */ + public static String getUserReposUrl(String sortBy) { + return GITHUB_API_USER_REPOS_URL + "?sort=" + sortBy + "&per_page=100"; + } + + public static String getUserReposUrl(){ + return getUserReposUrl("updated"); + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79bf687f8..01977f784 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -128,6 +128,8 @@ Please check if ext. storage is correctly inserted and mounted. Voice recording has failed Error while parsing XML layout file. Please revert to default layout. + Token must be 40 characters + Error while creating the PR" Permission required @@ -232,6 +234,9 @@ Creating repository You must specify a repository name You must specify a value for this field + Retrieving repositories... + Error retrieving repositories + Successfully retrieved repositories Configure GitHub token: