From 2dc2fb39a2ef0f0323435eb875550ac8bb544660 Mon Sep 17 00:00:00 2001
From: Gersbacher Pirmin <pg045@hdm-stuttgart.de>
Date: Sat, 12 Dec 2020 03:01:17 +0100
Subject: [PATCH] =?UTF-8?q?Export=20der=20Ergebnisse=20-=20erste=20Schritt?=
 =?UTF-8?q?e=20*=20Im=20Accessibility=20Service=20k=C3=B6nnen=20nun=20Info?=
 =?UTF-8?q?rmationen=20gespeichert=20werden=20(Text=20Datei)=20*=20in=20de?=
 =?UTF-8?q?r=20Main=20Activity=20k=C3=B6nnen=20diese=20Daten=20anschlie?=
 =?UTF-8?q?=C3=9Fend=20ausgelesen=20und=20als=20Email=20versendet=20werden?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/AndroidManifest.xml              |  13 +-
 .../CustomButton.java                         |   4 -
 .../MainActivity.java                         | 107 ++++++++++
 .../MyAccessibilityServiceV2.java             | 199 +++++++++++++++++-
 app/src/main/res/layout/activity_main.xml     |   8 +-
 app/src/main/res/layout/floatingwindow.xml    |  27 +++
 app/src/main/res/xml/provider_paths.xml       |   5 +
 7 files changed, 354 insertions(+), 9 deletions(-)
 create mode 100644 app/src/main/res/layout/floatingwindow.xml
 create mode 100644 app/src/main/res/xml/provider_paths.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3613f1d..4d45478 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
+        android:requestLegacyExternalStorage="true"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
@@ -34,8 +35,18 @@
                 android:name="android.accessibilityservice"
                 android:resource="@xml/serviceconfig" />
         </service>
-    </application>
 
+        <provider
+            android:authorities="com.example.accessibilityserviceappv2.fileprovider"
+            android:name="androidx.core.content.FileProvider"
+            android:grantUriPermissions="true"
+            android:exported="false">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/provider_paths"/>
+        </provider>
+
+    </application>
 
 
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java b/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java
index 9271232..3166ebb 100644
--- a/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java
+++ b/app/src/main/java/com/example/accessibilityserviceappv2/CustomButton.java
@@ -99,11 +99,7 @@ public class CustomButton extends androidx.appcompat.widget.AppCompatButton /*im
 
     }
 */
-    public void openDialog(){
 
-        ExampleDialog exampleDialog = new ExampleDialog();
-
-    }
 
     public String showContent(){
         return this.contentDescription;
diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java b/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java
index 46c36c2..f605eea 100644
--- a/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java
+++ b/app/src/main/java/com/example/accessibilityserviceappv2/MainActivity.java
@@ -1,8 +1,28 @@
 package com.example.accessibilityserviceappv2;
 
 import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.FileProvider;
 
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.Toast;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
 
 public class MainActivity extends AppCompatActivity {
 
@@ -10,5 +30,92 @@ public class MainActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
+        ActivityCompat.requestPermissions(MainActivity.this, new String[]{WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE}, 1);
+
+        Button testButoon = (Button) findViewById(R.id.button25);
+
+        Context context = getApplicationContext();
+
+        testButoon.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                export();
+            }
+        });
+
+
+    }
+
+
+
+    private String readFromFile(Context context) {
+
+        String ret = "";
+
+        try {
+            InputStream inputStream = context.openFileInput("mytesttext.txt");
+
+            if ( inputStream != null ) {
+                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
+                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+                String receiveString = "";
+                StringBuilder stringBuilder = new StringBuilder();
+
+                while ( (receiveString = bufferedReader.readLine()) != null ) {
+                    stringBuilder.append("\n").append(receiveString);
+                }
+
+                inputStream.close();
+                ret = stringBuilder.toString();
+            }
+        }
+        catch (FileNotFoundException e) {
+            Log.e("login activity", "File not found: " + e.toString());
+        } catch (IOException e) {
+            Log.e("login activity", "Can not read file: " + e.toString());
+        }
+
+        return ret;
+    }
+
+
+    public void export(){
+
+        //generate data
+        StringBuilder data = new StringBuilder();
+        data.append("Time, Distance");
+        for(int i = 0; i<5; i++ ){
+            data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i));
+        }
+
+        try{
+            //saving the file into device
+            FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE);
+            out.write((data.toString()).getBytes());
+            out.close();
+
+
+            //exporting
+            Context context = getApplicationContext();
+
+
+            File filelocation = new File(getFilesDir(), "mytesttext.txt");
+            Uri path = FileProvider.getUriForFile(context, "com.example.accessibilityserviceappv2.fileprovider", filelocation);
+            Intent fileIntent = new Intent(Intent.ACTION_SEND);
+            //fileIntent.setAction(Intent.ACTION_SEND);
+            fileIntent.setType("text/csv");
+            fileIntent.putExtra(Intent.EXTRA_SUBJECT, "Data");
+            fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            fileIntent.putExtra(Intent.EXTRA_STREAM, path);
+            //fileIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+            //fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            startActivity(Intent.createChooser(fileIntent, "Send Mail"));
+
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+
+
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java b/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java
index 5ee6dd0..5e21c02 100644
--- a/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java
+++ b/app/src/main/java/com/example/accessibilityserviceappv2/MyAccessibilityServiceV2.java
@@ -1,8 +1,11 @@
 package com.example.accessibilityserviceappv2;
 
 import android.accessibilityservice.AccessibilityService;
+import android.content.ComponentName;
+import android.content.Intent;
 import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.shapes.RectShape;
+import android.net.Uri;
 import android.text.Html;
 import android.util.Log;
 import android.view.ViewGroup;
@@ -31,8 +34,20 @@ import android.widget.RelativeLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.FileProvider;
+
 import org.w3c.dom.Text;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -40,6 +55,10 @@ import java.util.List;
 
 import java.util.List;
 
+import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
+import static java.net.Proxy.Type.HTTP;
+
 public class MyAccessibilityServiceV2 extends AccessibilityService {
 
     FrameLayout mLayout;
@@ -82,6 +101,7 @@ public class MyAccessibilityServiceV2 extends AccessibilityService {
                 case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: {
 
                     logNodeHierarchy(getRootInActiveWindow(), 0);
+                    addExportButton();
                 }
 
                 case AccessibilityEvent.TYPE_VIEW_CLICKED: {
@@ -358,4 +378,181 @@ public class MyAccessibilityServiceV2 extends AccessibilityService {
 
     }
 
-}
+
+    public void addExportButton(){
+
+        Context context = getApplicationContext();
+
+
+        Button exportButton = new Button(this);
+        exportButton.setText("Export Button");
+
+        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
+
+
+        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
+
+        lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
+        lp.format = PixelFormat.TRANSLUCENT;
+        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        // lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+        lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
+        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+        //lp.alpha = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+        lp.gravity = Gravity.TOP;
+        lp.x = 0;
+        lp.y = 0;
+
+        exportButton.setOnClickListener(new View.OnClickListener(){
+            public void onClick(View v){
+                //export();
+                //emailTest();
+                //intentTest();
+                String btnNumber = "Test Anzahl " + btnCounter;
+                //writeFileOnInternalStorage(context, "testFilename", "testFileBodyText");
+                //writeToFile(btnNumber, context);
+                String testText = readFromFile(context);
+                Log.v(LOG_TAG, testText);
+
+            }
+        });
+
+
+        wm.addView(exportButton, lp);
+
+    }
+
+
+    public void export(){
+
+        //generate data
+        StringBuilder data = new StringBuilder();
+        data.append("Time, Distance");
+        for(int i = 0; i<5; i++ ){
+            data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i));
+        }
+
+        try{
+            //saving the file into device
+            FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE);
+            out.write((data.toString()).getBytes());
+            out.close();
+
+            /*
+            //exporting
+            Context context = getApplicationContext();
+            File filelocation = new File(getFilesDir(), "data.csv");
+            Uri path = FileProvider.getUriForFile(context, "com.example.accessibilityserviceappv2.fileprovider", filelocation);
+            Intent fileIntent = new Intent();
+            fileIntent.setAction(Intent.ACTION_SEND);
+            fileIntent.putExtra(Intent.EXTRA_SUBJECT, "Data");
+            fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            fileIntent.putExtra(Intent.EXTRA_STREAM, path);
+            fileIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+            //fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            startActivity(Intent.createChooser(fileIntent, "Send Mail"));
+             */
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+
+
+    }
+
+    public void emailTest(){
+/*        Intent emailIntent = new Intent(Intent.ACTION_SEND);
+        //Intent emailIntent = new Intent(App.getContext(), App.class);
+        emailIntent.setType("text/html");
+        emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
+        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
+        emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
+        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
+        emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        emailIntent.setComponent(new ComponentName(getApplicationContext().getPackageName(),  App.class.getName()));
+
+        startActivity(Intent.createChooser(emailIntent, "Send Email"));*/
+// You can also attach multiple items by passing an ArrayList of Uris
+
+    }
+
+    public void intentTest(){
+        Intent intent = new Intent();
+        intent.setAction(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        ComponentName cn = new ComponentName(this, MainActivity.class);
+        intent.setComponent(cn);
+        startActivity(intent);
+    }
+
+
+    public void writeFileOnInternalStorage(Context mcoContext, String sFileName, String sBody){
+        File dir = new File(mcoContext.getFilesDir(), "mydir");
+
+/*
+        try {
+            File myFile = new File("Your File name");
+            myFile.createNewFile();
+            FileOutputStream fOut = new FileOutputStream(myFile);
+            OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut);
+            myOutWriter.append("testtext");
+            myOutWriter.close();
+            fOut.close();
+            Toast.makeText(getApplicationContext(), "Done writing SD 'mysdfile.txt", Toast.LENGTH_SHORT).show();
+
+        }
+        catch (Exception e)
+        {
+            Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
+        }*/
+
+
+
+    }
+
+    private void writeToFile(String data,Context context) {
+        try {
+            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("mytesttext.txt", Context.MODE_PRIVATE));
+            outputStreamWriter.write(data);
+            outputStreamWriter.close();
+        }
+        catch (IOException e) {
+            Log.e("Exception", "File write failed: " + e.toString());
+        }
+    }
+
+    private String readFromFile(Context context) {
+
+        String ret = "";
+
+        try {
+            InputStream inputStream = context.openFileInput("mytesttext.txt");
+
+            if ( inputStream != null ) {
+                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
+                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+                String receiveString = "";
+                StringBuilder stringBuilder = new StringBuilder();
+
+                while ( (receiveString = bufferedReader.readLine()) != null ) {
+                    stringBuilder.append("\n").append(receiveString);
+                }
+
+                inputStream.close();
+                ret = stringBuilder.toString();
+            }
+        }
+        catch (FileNotFoundException e) {
+            Log.e("login activity", "File not found: " + e.toString());
+        } catch (IOException e) {
+            Log.e("login activity", "Can not read file: " + e.toString());
+        }
+
+        return ret;
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 439d3a0..43c711c 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -17,12 +17,14 @@
         app:layout_constraintTop_toTopOf="parent" />
 
     <androidx.appcompat.widget.AppCompatButton
-        android:id="@+id/button2"
+        android:id="@+id/button25"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Button"
+        android:text="Export Data"
         app:layout_constraintBottom_toTopOf="@+id/textView"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="0.548" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/floatingwindow.xml b/app/src/main/res/layout/floatingwindow.xml
new file mode 100644
index 0000000..43cfc80
--- /dev/null
+++ b/app/src/main/res/layout/floatingwindow.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.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:minHeight="250dp"
+    android:layout_height="wrap_content"
+    android:background="@color/LightGrey">
+
+    <TextView
+        android:id="@+id/textView2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="This is the floating text view\n Hallo"
+        android:lineSpacingExtra="20sp"
+        android:fontFamily="sans-serif-thin"
+        android:textColor="@color/Black"
+        android:textSize="20sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.497"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="0.155" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..71f66a9
--- /dev/null
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,5 @@
+<paths>
+    <files-path
+        name="data"
+        path="./"/>
+</paths>
\ No newline at end of file
-- 
GitLab