diff --git a/.gitignore b/.gitignore index d1a486f..b325e98 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ /captures .externalNativeBuild /.idea +/keystores/release.properties +/keystores/release_keystore.jks \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d461b94..ff602a1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,13 @@ apply plugin: 'com.android.application' +def propertiesFilename = "..\\keystores\\release.properties" +if (!project.file(propertiesFilename).exists()) { + propertiesFilename = "..\\keystores\\test_release.properties" +} + +def singingProperties = new Properties() +singingProperties.load(new FileInputStream(file(propertiesFilename))) + android { compileSdkVersion 26 defaultConfig { @@ -10,16 +18,27 @@ android { versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + signingConfigs { + release { + keyAlias singingProperties.releaseSignKeyAlias + keyPassword singingProperties.releaseSignKeyPassword + storeFile file(singingProperties.releaseStoreFilePath) + storePassword singingProperties.releaseStorePassword + + } + } buildTypes { release { - minifyEnabled false + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release } } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 60dad6c..7b7831c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ package="com.example.anna.myapplication"> + + - + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/anna/myapplication/data/LoadDatabaseIntentService.java b/app/src/main/java/com/example/anna/myapplication/data/LoadDatabaseIntentService.java new file mode 100644 index 0000000..eef0257 --- /dev/null +++ b/app/src/main/java/com/example/anna/myapplication/data/LoadDatabaseIntentService.java @@ -0,0 +1,32 @@ +package com.example.anna.myapplication.data; + +import java.io.FileOutputStream; + +import android.app.IntentService; +import android.content.Context; +import android.content.Intent; +import android.widget.Toast; + +import com.example.anna.myapplication.presentation.MyApplication; + +public class LoadDatabaseIntentService extends IntentService { + + public LoadDatabaseIntentService() { + super("LoadDatabaseIntentService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + if (intent != null) { + String databaseBackup = MyApplication.getPersonDao().loadAll().toString(); + String fileName = intent.getStringExtra("fileName"); + try(FileOutputStream fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE); + ) { + fileOutputStream.write(databaseBackup.getBytes()); + } catch (Exception e) { + Toast toast = Toast.makeText(this, "An error occurred while writing database", Toast.LENGTH_LONG); + toast.show(); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/anna/myapplication/data/PersonContract.java b/app/src/main/java/com/example/anna/myapplication/data/PersonContract.java index 6a8c5ff..83949f5 100644 --- a/app/src/main/java/com/example/anna/myapplication/data/PersonContract.java +++ b/app/src/main/java/com/example/anna/myapplication/data/PersonContract.java @@ -4,7 +4,6 @@ public interface PersonContract extends BaseColumns { - String TABLE_NAME = "personsTable"; String NAME = "name"; diff --git a/app/src/main/java/com/example/anna/myapplication/domain/Person.java b/app/src/main/java/com/example/anna/myapplication/domain/Person.java index 1a4a3cf..3cd7c2e 100644 --- a/app/src/main/java/com/example/anna/myapplication/domain/Person.java +++ b/app/src/main/java/com/example/anna/myapplication/domain/Person.java @@ -71,11 +71,29 @@ public void setBirthday(String birthday) { @Override public String toString() { + String returnedString = "Person{id="; if (id == NOT_SPECIFIED_LONG) { - return "Person{" + "id=?, name='" + name + "\'" + '}'; + returnedString = returnedString.concat("?"); } else { - return "Person{" + "id=" + id + ", name='" + name + "\'" + '}'; + returnedString = returnedString.concat("" + id); } + if (!name.equals(NOT_SPECIFIED_STRING)) { + returnedString = returnedString.concat(", name='" + name + "\'"); + } + if (!note.equals(NOT_SPECIFIED_STRING)) { + returnedString = returnedString.concat(", note='" + note + "\'"); + } + if (imageRes != NOT_SPECIFIED_INT) { + returnedString = returnedString.concat(", imageRes=" + imageRes); + } + if (!imageLink.equals(NOT_SPECIFIED_STRING)) { + returnedString = returnedString.concat(", imageLink='" + imageLink + "\'"); + } + if (!birthday.equals(NOT_SPECIFIED_STRING)) { + returnedString = returnedString.concat(", birthday=" + birthday); + } + returnedString = returnedString.concat("}"); + return returnedString; } } diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/IntentServiceActivity.java b/app/src/main/java/com/example/anna/myapplication/presentation/IntentServiceActivity.java new file mode 100644 index 0000000..ea49c78 --- /dev/null +++ b/app/src/main/java/com/example/anna/myapplication/presentation/IntentServiceActivity.java @@ -0,0 +1,55 @@ +package com.example.anna.myapplication.presentation; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.Button; +import android.widget.TextView; + +import com.example.anna.myapplication.R; + +import java.io.FileInputStream; + +public class IntentServiceActivity extends AppCompatActivity { + + private TextView DatabaseTextView; + private Button DatabaseLoadButton, nextButton, backButton; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.intent_service); + + DatabaseTextView = (TextView) findViewById(R.id.textView); + + DatabaseLoadButton = (Button) findViewById(R.id.loadDatabaseButton); + DatabaseLoadButton.setOnClickListener(view -> { + StringBuilder stringBuilder = new StringBuilder(); + try{ + FileInputStream fstream = openFileInput(MyApplication.getFileName()); + int i; + while ((i = fstream.read())!= -1){ + stringBuilder.append((char)i); + } + fstream.close(); + DatabaseTextView.setText(stringBuilder.toString()); + }catch (Exception e){ + DatabaseTextView.setText(getResources().getString(R.string.error_load_database)); + } + + }); + + nextButton = findViewById(R.id.nextScreenButton); + nextButton.setOnClickListener(view -> { + Intent startActivity = new Intent(this, TouchActivity.class); + startActivity(startActivity); + }); + + backButton = findViewById(R.id.to_first_activity_button); + backButton.setOnClickListener(view -> { + Intent startActivity = new Intent(this, MainActivity.class); + startActivity(startActivity); + }); + } +} diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/MainActivity.java b/app/src/main/java/com/example/anna/myapplication/presentation/MainActivity.java index f987268..be5b314 100644 --- a/app/src/main/java/com/example/anna/myapplication/presentation/MainActivity.java +++ b/app/src/main/java/com/example/anna/myapplication/presentation/MainActivity.java @@ -48,7 +48,7 @@ protected void onCreate(Bundle savedInstanceState) { buttonTraining = findViewById(R.id.training_thread); buttonTraining.setOnClickListener(view -> { - Intent startActivity = new Intent(MainActivity.this, RoomDB.class); + Intent startActivity = new Intent(MainActivity.this, TouchActivity.class); startActivity(startActivity); }); } diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/MyApplication.java b/app/src/main/java/com/example/anna/myapplication/presentation/MyApplication.java index cce6dbc..3fba448 100644 --- a/app/src/main/java/com/example/anna/myapplication/presentation/MyApplication.java +++ b/app/src/main/java/com/example/anna/myapplication/presentation/MyApplication.java @@ -2,18 +2,23 @@ import android.app.Application; import android.arch.persistence.room.Room; +import android.content.Intent; +import com.example.anna.myapplication.data.LoadDatabaseIntentService; import com.example.anna.myapplication.data.AppDatabase; import com.example.anna.myapplication.data.DatabaseHolder; import com.example.anna.myapplication.data.PersonDao; import com.example.anna.myapplication.data.PersonRepository; import com.facebook.drawee.backends.pipeline.Fresco; +import java.util.Date; + public class MyApplication extends Application { private static AppDatabase database; private static PersonRepository personRepository; private static DatabaseHolder databaseHolder; + private static String fileName; public static PersonDao getPersonDao(){ return database.PersonDao(); @@ -21,6 +26,15 @@ public static PersonDao getPersonDao(){ public static PersonRepository getRepository(){ return personRepository; } + public static String getFileName(){ + return fileName; + } + + private String getFileNameOnCurrentTime(){ + Date currentDate = new Date(); + long millisFromStart = currentDate.getTime(); + return "backup-" + millisFromStart; + } @Override public void onCreate() { @@ -36,6 +50,11 @@ public void onCreate() { .build(); setInitialData(); + + // Запускаем IntentService + Intent intentMyIntentService = new Intent(this, LoadDatabaseIntentService.class); + fileName = getFileNameOnCurrentTime(); + startService(intentMyIntentService.putExtra("fileName", fileName)); } public static void setInitialData(){ diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/PersonDetailFragment.java b/app/src/main/java/com/example/anna/myapplication/presentation/PersonDetailFragment.java index 1f1249b..3ebce87 100644 --- a/app/src/main/java/com/example/anna/myapplication/presentation/PersonDetailFragment.java +++ b/app/src/main/java/com/example/anna/myapplication/presentation/PersonDetailFragment.java @@ -5,8 +5,11 @@ import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.view.GestureDetectorCompat; +import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; @@ -17,7 +20,9 @@ import com.facebook.drawee.view.SimpleDraweeView; import static android.app.Activity.RESULT_OK; -public class PersonDetailFragment extends Fragment { +public class PersonDetailFragment extends Fragment implements + GestureDetector.OnGestureListener, + GestureDetector.OnDoubleTapListener{ private static EditText editText; private SimpleDraweeView imageView; @@ -25,6 +30,7 @@ public class PersonDetailFragment extends Fragment { private static final String ARG_DESCRIPTION = "description"; private static final String ARG_PERSON_ID = "personId"; private long personId = -1; + private GestureDetectorCompat gestureDetectorCompat; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -61,6 +67,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, if (savedInstanceState != null) { editText.setText(savedInstanceState.getString(ARG_DESCRIPTION)); } + + gestureDetectorCompat = new GestureDetectorCompat(getContext(),this); + gestureDetectorCompat.setOnDoubleTapListener(this); + + view.setOnTouchListener(new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + return gestureDetectorCompat.onTouchEvent(event); + } + }); return view; } @@ -91,12 +106,12 @@ protected Person doInBackground(final String... strings) { MyApplication.getPersonDao().update(person); // SQLite - /* ContentValues updatedValues = new ContentValues(); - updatedValues.put(AppSQLiteOpenHelper.Columns.BIRTHDAY, birthday); - MyApplication.personRepository.update( - personId, - updatedValues); - */ + /* ContentValues updatedValues = new ContentValues(); + updatedValues.put(AppSQLiteOpenHelper.Columns.BIRTHDAY, birthday); + MyApplication.personRepository.update( + personId, + updatedValues); + */ return person; } @@ -158,4 +173,51 @@ protected void onPostExecute(final Person person) { editText.setText(person.getNote()); } } + + @Override + public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { + return true; + } + + @Override + public boolean onDoubleTapEvent(MotionEvent event) { + return true; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent event) { + return true; + } + + @Override + public boolean onDown(MotionEvent event) { + return true; + } + + @Override + public void onShowPress(MotionEvent event) {} + + @Override + public void onLongPress(MotionEvent event) {} + + @Override + public boolean onDoubleTap(MotionEvent event) { + return true; + } + + @Override + public boolean onFling(MotionEvent event1, MotionEvent event2, + float velocityX, float velocityY) { + float deltaX = event1.getX() - event2.getX(); + float deltaY = event1.getY() - event2.getY(); + if ((Math.abs(deltaY) > Math.abs(deltaX)) && (deltaY < 0)) { + getActivity().onBackPressed(); + } + return true; + } + + @Override + public boolean onSingleTapUp(MotionEvent event) { + return true; + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/PersonListActivity.java b/app/src/main/java/com/example/anna/myapplication/presentation/PersonListActivity.java index 8e0e0bb..2ef04f3 100644 --- a/app/src/main/java/com/example/anna/myapplication/presentation/PersonListActivity.java +++ b/app/src/main/java/com/example/anna/myapplication/presentation/PersonListActivity.java @@ -6,7 +6,7 @@ import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.util.Log; +import android.view.MotionEvent; import android.view.View; import com.example.anna.myapplication.R; diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/RoomDB.java b/app/src/main/java/com/example/anna/myapplication/presentation/RoomDB.java index f40c511..6cabb61 100644 --- a/app/src/main/java/com/example/anna/myapplication/presentation/RoomDB.java +++ b/app/src/main/java/com/example/anna/myapplication/presentation/RoomDB.java @@ -37,8 +37,8 @@ protected void onCreate(Bundle savedInstanceState) { nextButton = findViewById(R.id.nextScreenButton); nextButton.setOnClickListener(view -> { - // Intent startActivity = new Intent(this, RoomDB.class); - //startActivity(startActivity); + Intent startActivity = new Intent(this, IntentServiceActivity.class); + startActivity(startActivity); }); backButton = findViewById(R.id.to_first_activity_button); diff --git a/app/src/main/java/com/example/anna/myapplication/presentation/TouchActivity.java b/app/src/main/java/com/example/anna/myapplication/presentation/TouchActivity.java new file mode 100644 index 0000000..341be4b --- /dev/null +++ b/app/src/main/java/com/example/anna/myapplication/presentation/TouchActivity.java @@ -0,0 +1,61 @@ +package com.example.anna.myapplication.presentation; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.MotionEvent; +import android.widget.TextView; + +import com.example.anna.myapplication.R; + +public class TouchActivity extends AppCompatActivity { + + private TextView textView; + private String sDown, sMove, sUp; + private float downX, downY; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.touch); + textView = findViewById(R.id.text_view_for_motion); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + + float x = event.getX(); + float y = event.getY(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: // нажатие + sDown = "Down: " + x + "," + y; + sMove = ""; sUp = ""; + + downX = event.getX(); + downY = event.getY(); + break; + case MotionEvent.ACTION_MOVE: // движение + sMove = "Move: " + x + "," + y; + break; + case MotionEvent.ACTION_UP: // отпускание + case MotionEvent.ACTION_CANCEL: + sMove = ""; + sUp = "Up: " + x + "," + y; + + float upX = event.getX(); + float upY = event.getY(); + + float deltaX = downX - upX; + float deltaY = downY - upY; + if ((Math.abs(deltaY) > Math.abs(deltaX)) && (deltaY < 0)) { + Intent startActivity = new Intent(TouchActivity.this, MainActivity.class); + startActivity(startActivity); + } + break; + } + textView.setText(sDown + "\n" + sMove + "\n" + sUp); + return true; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/intent_service.xml b/app/src/main/res/layout/intent_service.xml new file mode 100644 index 0000000..eb4bb0a --- /dev/null +++ b/app/src/main/res/layout/intent_service.xml @@ -0,0 +1,47 @@ + + + +