diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3613f1d5f6b9a55c2e45772803bfa641d819a833..4d454786cd56bf68efc7a046444b5c90fed489e8 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 9271232359f95c81079dbf97405a3350f8b2d219..3166ebbdbd8a8a039920b08f58d3c1a467175ead 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 46c36c2df4a85384da2a040ce196147517cad755..f605eeaf5cc2ef0c56ed6d74d8f4903496a2a649 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 5ee6dd0f2316531f51d6ac03d02400ac3ab78f0e..5e21c02e7430386ab751b6f9e2b75ff0dfbdcd35 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 439d3a057058bed3d97c7cd94299ae8d3818ea9c..43c711c7fc3d7ad5c87b63b13009e7c033821991 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 0000000000000000000000000000000000000000..43cfc8095ae4639a21dde99a2fec72baaf83cdcd --- /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 0000000000000000000000000000000000000000..71f66a96b5a0b43c3164534d1b397fe08a769a23 --- /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