Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified Ganttproject_mobile/.idea/caches/build_file_checksums.ser
Binary file not shown.
2 changes: 1 addition & 1 deletion Ganttproject_mobile/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Ganttproject_mobile/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 18 additions & 3 deletions Ganttproject_mobile/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ apply plugin: 'com.google.protobuf'

android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.bardsoftware.ganttproject_mobile"
minSdkVersion 15
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
Expand All @@ -19,6 +20,9 @@ android {
}
}

/*sourceSets {
main.java.srcDirs += "${protobuf.generatedFilesBaseDir}/main/javalite"
}*/
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
Expand All @@ -34,7 +38,7 @@ protobuf {
remove java
}
task.plugins {
javalite { }
javalite {}
}
}
}
Expand All @@ -44,9 +48,20 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:27.1.1'

implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

implementation 'com.google.protobuf:protobuf-lite:3.0.0'

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

testImplementation 'junit:junit:4.12'
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})
}
6 changes: 6 additions & 0 deletions Ganttproject_mobile/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bardsoftware.ganttproject_mobile">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Expand All @@ -16,6 +21,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TasksActivity"></activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.bardsoftware.ganttproject_mobile;

public class Constants {
public static final String FILE_PATH = "FilePath";
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@ protected void onCreate(Bundle savedInstanceState) {
}

public void openProtoFile(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("application/octet-stream");
startActivityForResult(intent, OPEN_FILE_CODE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OPEN_FILE_CODE && resultCode == RESULT_OK && data != null)
{ String filePath = data.getDataString();
// do somthing...
Bundle b = new Bundle();
b.putString(Constants.FILE_PATH, filePath);
Class TasksActivity = TasksActivity.class;
Intent intent = new Intent(this, TasksActivity);
intent.putExtras(b);
startActivity(intent);
}
super.onActivityResult(requestCode, resultCode, data);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.bardsoftware.ganttproject_mobile;

import android.content.Context;
import android.graphics.Paint;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import static dataformat.Dataformat.Task;
import static dataformat.Dataformat.Tasks;

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder>{
private Tasks tasks;
private Context mContext;
private SparseBooleanArray taskStateArray = new SparseBooleanArray();
private ArrayList<String> tasksNames=new ArrayList<String>();

@NonNull
@Override
public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.task_row, parent, false);;
return new TaskAdapter.TaskViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) {
if (tasks == null) return;
String taskName = tasks.getTask(position).getName();
boolean itemIsChecked = tasks.getTask(position).getIsDone();
taskStateArray.append(position, itemIsChecked);
tasksNames.add(taskName);
holder.taskView.setText(taskName);
holder.taskCheckbox.setChecked(itemIsChecked);
if (itemIsChecked) {
holder.taskView.setPaintFlags(holder.taskView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
holder.itemView.setTag(taskName);

}

@Override
public int getItemCount() {
if (tasks == null) return 0;
return tasks.getTaskCount();
}

public void setData(Tasks tasks1, Context context) {
tasks = tasks1;
mContext = context;
notifyDataSetChanged();
}

public Tasks getTasks() {
Tasks.Builder tasks1 = Tasks.newBuilder();
for (int i=0; i< getItemCount(); i++){
Task task = Task.newBuilder()
.setName(tasksNames.get(i))
.setIsDone(taskStateArray.valueAt(i))
.build();
tasks1.addTask(task);
}
return tasks1.build();
}

public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
@BindView(R.id.task_textview)
TextView taskView;
@BindView(R.id.task_checkbox)
CheckBox taskCheckbox;

public TaskViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
taskCheckbox.setOnClickListener(this);
}

@Override
public void onClick(View view) {

int adapterPosition = getAdapterPosition();
if (!taskStateArray.get(adapterPosition, false)) {
taskCheckbox.setChecked(true);
taskView.setPaintFlags(taskView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
taskStateArray.put(adapterPosition, true);
} else {
taskCheckbox.setChecked(false);
taskStateArray.put(adapterPosition, false);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.bardsoftware.ganttproject_mobile;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Parcelable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import butterknife.BindView;

import static dataformat.Dataformat.Tasks;

public class TasksActivity extends AppCompatActivity {
Uri filePath;
Context mContext;
private TaskAdapter taskAdapter;
Tasks tasks;
//@BindView(R.id.tasks_recyclerview)
RecyclerView tasksRecyclerView;
private static final String LAYOUT_POSITION = "position";
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tasks);
mContext=this;
if (savedInstanceState == null) {
Bundle bundle = getIntent().getExtras();
filePath = Uri.parse(bundle.getString(Constants.FILE_PATH));
}
verifyStoragePermissions(this);

try {
InputStream input = mContext.getContentResolver().openInputStream(filePath);
tasks = Tasks.parseFrom(input);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

tasksRecyclerView = findViewById(R.id.tasks_recyclerview);
tasksRecyclerView.setLayoutManager(new LinearLayoutManager(this));
taskAdapter = new TaskAdapter();
tasksRecyclerView.setAdapter(taskAdapter);
taskAdapter.setData(tasks, this);

if (savedInstanceState != null) {
Parcelable savedRecyclerLayoutState = savedInstanceState.getParcelable("position");
tasksRecyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState);
}
}

public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}

public void saveTasksFile(View view) {
tasks=taskAdapter.getTasks();
mContext.grantUriPermission("com.bardsoftware.ganttproject_mobile", filePath, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {

OutputStream output = mContext.getContentResolver().openOutputStream(filePath);
tasks.writeTo(output);
output.close();
Toast.makeText(this, "file "+filePath.getPath()+" is saved", Toast.LENGTH_LONG).show();

} catch (Exception e) {
e.printStackTrace();
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(LAYOUT_POSITION, tasksRecyclerView.getLayoutManager().onSaveInstanceState());
}
}
10 changes: 10 additions & 0 deletions Ganttproject_mobile/app/src/main/proto/dataformat.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
syntax = "proto3";
package dataformat;

message Task {
string name = 1;
bool is_done = 2;
}
message Tasks {
repeated Task task= 1;
}
41 changes: 41 additions & 0 deletions Ganttproject_mobile/app/src/main/res/layout/activity_tasks.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TasksActivity">


<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:layout_editor_absoluteX="86dp"
tools:layout_editor_absoluteY="16dp">


<android.support.v7.widget.RecyclerView
android:id="@+id/tasks_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"

android:scrollbars="vertical" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:text="@string/save"
app:layout_constraintBottom_toBottomOf="@+id/tasks_recyclerview"
android:onClick="saveTasksFile"/>


</LinearLayout>





</android.support.constraint.ConstraintLayout>
Loading