diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 036e310e..d90c021d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,8 +11,11 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
+
@@ -64,8 +67,8 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java
new file mode 100644
index 00000000..5c4065d1
--- /dev/null
+++ b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java
@@ -0,0 +1,147 @@
+package org.mian.gitnex.activities;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import org.mian.gitnex.R;
+import org.mian.gitnex.clients.RetrofitClient;
+import org.mian.gitnex.helpers.AlertDialogs;
+import org.mian.gitnex.helpers.Toasty;
+import org.mian.gitnex.models.Files;
+import org.mian.gitnex.util.AppUtil;
+import org.mian.gitnex.util.TinyDB;
+import retrofit2.Call;
+import retrofit2.Callback;
+
+/**
+ * Author M M Arif
+ */
+
+public class FileViewActivity extends AppCompatActivity {
+
+ private View.OnClickListener onClickListener;
+ private TextView singleFileContents;
+ final Context ctx = this;
+ private ProgressBar mProgressBar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_file_view);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ final TinyDB tinyDb = new TinyDB(getApplicationContext());
+ String repoFullName = tinyDb.getString("repoFullName");
+ String[] parts = repoFullName.split("/");
+ final String repoOwner = parts[0];
+ final String repoName = parts[1];
+ final String instanceUrl = tinyDb.getString("instanceUrl");
+ final String loginUid = tinyDb.getString("loginUid");
+ final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
+
+ boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext());
+
+ ImageView closeActivity = findViewById(R.id.close);
+ singleFileContents = findViewById(R.id.singleFileContents);
+ singleFileContents.setVisibility(View.GONE);
+ mProgressBar = findViewById(R.id.progress_bar);
+
+ String singleFileName = getIntent().getStringExtra("singleFileName");
+
+ TextView toolbar_title = findViewById(R.id.toolbar_title);
+ toolbar_title.setText(singleFileName);
+
+ initCloseListener();
+ closeActivity.setOnClickListener(onClickListener);
+
+ if(connToInternet) {
+ getSingleFileContents(instanceUrl, instanceToken, repoOwner, repoName, singleFileName);
+ }
+ else {
+ Toasty.info(getApplicationContext(), getString(R.string.checkNetConnection));
+ }
+
+ }
+
+ private void getSingleFileContents(String instanceUrl, String token, final String owner, String repo, final String filename) {
+
+ Call call = RetrofitClient
+ .getInstance(instanceUrl)
+ .getApiInterface()
+ .getSingleFileContents(token, owner, repo, filename);
+
+ call.enqueue(new Callback() {
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) {
+
+ if (response.code() == 200) {
+
+ AppUtil appUtil = new AppUtil();
+ assert response.body() != null;
+
+ if(!response.body().getContent().equals("")) {
+ singleFileContents.setVisibility(View.VISIBLE);
+ mProgressBar.setVisibility(View.GONE);
+ singleFileContents.setText(appUtil.decodeBase64(response.body().getContent()));
+ }
+ else {
+ singleFileContents.setText("");
+ mProgressBar.setVisibility(View.GONE);
+ }
+
+ }
+ else if(response.code() == 401) {
+
+ AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
+ getResources().getString(R.string.alertDialogTokenRevokedMessage),
+ getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
+ getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
+
+ }
+ else if(response.code() == 403) {
+
+ Toasty.info(ctx, ctx.getString(R.string.authorizeError));
+
+ }
+ else if(response.code() == 404) {
+
+ Toasty.info(ctx, ctx.getString(R.string.apiNotFound));
+
+ }
+ else {
+
+ Toasty.info(getApplicationContext(), getString(R.string.labelGeneralError));
+
+ }
+
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+ Log.e("onFailure", t.toString());
+ }
+ });
+
+ }
+
+ private void initCloseListener() {
+ onClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ getIntent().removeExtra("singleFileName");
+ finish();
+ }
+ };
+ }
+
+}
diff --git a/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java
index 1755ffb9..7452842f 100644
--- a/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java
+++ b/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java
@@ -1,6 +1,8 @@
package org.mian.gitnex.adapters;
import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -11,6 +13,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R;
+import org.mian.gitnex.activities.FileViewActivity;
import org.mian.gitnex.models.Files;
import java.util.ArrayList;
import java.util.List;
@@ -29,26 +32,32 @@ public class FilesAdapter extends RecyclerView.Adapter createNewFile(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("file") String fileName, @Body NewFile jsonStr);
- @GET("repos/{owner}/{repo}/contents") // get all files and dirs
+ @GET("repos/{owner}/{repo}/contents") // get all the files and dirs of a repository
Call> getFiles(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName);
+
+ @GET("repos/{owner}/{repo}/contents/{file}") // get single file contents
+ Call getSingleFileContents(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("file") String file);
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_question_mark_24.xml b/app/src/main/res/drawable/ic_question_mark_24.xml
new file mode 100644
index 00000000..5ec2577a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_question_mark_24.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_file_view.xml b/app/src/main/res/layout/activity_file_view.xml
new file mode 100644
index 00000000..a22d64c8
--- /dev/null
+++ b/app/src/main/res/layout/activity_file_view.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/files_list.xml b/app/src/main/res/layout/files_list.xml
index bebd9514..1e0b113c 100644
--- a/app/src/main/res/layout/files_list.xml
+++ b/app/src/main/res/layout/files_list.xml
@@ -14,6 +14,12 @@
android:background="@color/backgroundColor"
tools:context=".activities.MainActivity">
+
+