diff --git a/app/build.gradle b/app/build.gradle
index 198d405..9a0cbe5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -39,6 +39,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'androidx.lifecycle:lifecycle-process:2.2.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 98f647d..35f2c97 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,9 +5,7 @@
-
-
diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java
index 4a95eb1..f9bfdcb 100644
--- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java
+++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java
@@ -1,31 +1,32 @@
package de.joel.zoomhelper;
-import android.Manifest;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
+import android.content.ClipData;
+import android.content.ClipboardManager;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
+import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Base64;
+import android.util.Log;
import android.view.View;
import android.widget.AutoCompleteTextView;
-import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
@@ -33,6 +34,7 @@ import androidx.core.graphics.drawable.IconCompat;
import com.github.javiersantos.appupdater.AppUpdater;
import com.github.javiersantos.appupdater.enums.UpdateFrom;
+import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputLayout;
import java.io.ByteArrayInputStream;
@@ -46,9 +48,13 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN;
+
class InstantAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
@@ -76,6 +82,7 @@ public class MainActivity extends AppCompatActivity {
public boolean testing;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -89,6 +96,7 @@ public class MainActivity extends AppCompatActivity {
testing = myIntent.getBooleanExtra("testing", false);
super.onCreate(savedInstanceState);
+
setContentView(R.layout.activity_main);
final ScrollView scrollview = findViewById(R.id.scrollArea);
@@ -140,7 +148,6 @@ public class MainActivity extends AppCompatActivity {
watchShareIcon();
watchShortcutIcon();
-
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
handleSendText(myIntent); // Handle text being sent
@@ -152,40 +159,104 @@ public class MainActivity extends AppCompatActivity {
String url = buildZoomURL(currMeeting.meetingID, currMeeting.meetingPWD, currMeeting.attendees.get(currMeeting.lastAtt).name, currMeeting.attendees.get(currMeeting.lastAtt).num);
launchZoomUrl(url);
} else {
- AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/update.xml");
+ AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/updatetest.xml");
appUpdater.setButtonUpdateClickListener((dialog, which) -> downloadAPK());
appUpdater.start();
}
}
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ if (hasFocus) {
+ importFromClipboard();
+ }
+ }
+
+
+ /* private void watchImportIcon() {
+ ImageView ImportIcon = findViewById(R.id.imageImport);
+ ImportIcon.setOnClickListener(v -> importFromClipboard());
+ }
+
+ void importFromClipboard() {
+ Log.d("import", "ImportFromClipboard");
+ ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
+ Log.d("clipboardManager", clipboard.toString());
+ if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) {
+ String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString();
+ Log.d("text", text);
+ handleSendText(text);
+ }
+ } */
+
+ private void importFromClipboard() {
+ LinearLayout layoutBegin = findViewById(R.id.layoutBegin);
+ ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
+
+ Snackbar snackbar = Snackbar.make(layoutBegin,R.string.foundImportableMeetingClipboard,Snackbar.LENGTH_INDEFINITE).setDuration(7000);
+ snackbar.setAction(R.string.importMeeting, view -> {
+ String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString();
+ handleSendText(text);
+ ClipData clipData = ClipData.newPlainText("", "");
+ clipboard.setPrimaryClip(clipData);
+ });
+
+ if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) {
+ String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString();
+ if (handleSendText(text, true)) {
+ snackbar.show();
+ }
+
+ }
+ }
+
private void downloadAPK() {
-
- String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
String fileName = "ZoomHelper.apk";
- destination += fileName;
-
+ File destination = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName);
+/*
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// this will request for permission when user has not granted permission for the app
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
- } else {
+ downloadAPK();
+ } else {*/
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
+ if (!getPackageManager().canRequestPackageInstalls()) {
+ Toast.makeText(this, R.string.PleaseAllowUnknownSources, Toast.LENGTH_LONG).show();
+ startActivityForResult(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:de.joel.zoomhelper")), 101);
+ Timer timer = new Timer(true);
+ timer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ if (getPackageManager().canRequestPackageInstalls()) {
+ finishActivity(101);
+ downloadAPK();
+ timer.cancel();
+ }
+ }
+ }, 0, 1000);
+ return;
+ }
+ }
+
+
//Delete update file if exists
- File file = new File(destination);
- final Uri localUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);
- if (file.exists())
+ final Uri localUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", destination);
+ if (destination.exists())
//file.delete() - test this, I think sometimes it doesnt work
- file.delete();
+ destination.delete();
//Download Script
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("https://baldaufwd.de/ZoomHelper/ZoomHelper.apk");
DownloadManager.Request request = new DownloadManager.Request(uri);
- request.setVisibleInDownloadsUi(true);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, uri.getLastPathSegment());
+ Log.d("Desturi", localUri.getPath());
+ request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, fileName);
final long downloadID = downloadManager.enqueue(request);
BroadcastReceiver onDownloadComplete = new BroadcastReceiver() {
@@ -209,13 +280,18 @@ public class MainActivity extends AppCompatActivity {
};
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
-
-
- }
-
+ //}
private void handleSendText(Intent intent) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
+ handleSendText(sharedText);
+ }
+
+ private void handleSendText(String sharedText) {
+ handleSendText(sharedText, false);
+ }
+
+ private boolean handleSendText(String sharedText, boolean checkOnly) {
String meetingID = "";
String meetingPWD = "";
String meetingName = "";
@@ -244,12 +320,13 @@ public class MainActivity extends AppCompatActivity {
dialog.dismiss();
});
AlertDialog alert = builder.create();
- alert.show();
+ if (!checkOnly) alert.show();
+ return false;
} else {
Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", "");
- if (searchMeetingInList(getMeetings(), mtgToImport.meetingName) == -1) {
+ if (searchMeetingInList(getMeetings(), mtgToImport.meetingName) == -1 && !checkOnly) {
fillMeeting(mtgToImport);
} else {
builder.setPositiveButton(R.string.override, (dialog, which) -> {
@@ -264,7 +341,8 @@ public class MainActivity extends AppCompatActivity {
dialog.dismiss();
});
AlertDialog alert = builder.create();
- alert.show();
+ if (!checkOnly) alert.show();
+ return true;
}
}
@@ -294,33 +372,49 @@ public class MainActivity extends AppCompatActivity {
AlertDialog alert = builder.create();
alert.show();*/
}
+ return true;
}
private void watchShortcutIcon() {
ImageView ShortcutIcon = findViewById(R.id.imageCreateShortcut);
+ ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI());
+ }
- ShortcutIcon.setOnClickListener(v -> {
+ private void showCreateShortcutUI() {
+ int meeting = searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.app_name);
+ builder.setTitle(R.string.app_name);
+
+ if (meeting == -1) {
+ builder.setMessage(R.string.cantCreateShortcut);
+ builder.setPositiveButton(R.string.saveMeeting, (dialog, which) -> {
+ dialog.dismiss();
+ saveMeetingFromUI();
+ showCreateShortcutUI();
+
+ });
+ builder.setNegativeButton(R.string.cancel, (dialog, which) -> {
+ dialog.dismiss();
+ });
+ }
+ else {
builder.setMessage(R.string.WantToJoinImmediately);
-
builder.setPositiveButton(R.string.joinImmediately, (dialog, which) -> {
dialog.dismiss();
- createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), true);
+ createMeetingShortcut(meeting, true);
});
builder.setNegativeButton(R.string.alwaysAsk, (dialog, which) -> {
dialog.dismiss();
- createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), false);
+ createMeetingShortcut(meeting, false);
});
+ }
+ AlertDialog alert = builder.create();
+ alert.show();
- AlertDialog alert = builder.create();
- alert.show();
-
- //createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), false);
- });
+ //createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), false);
}
private void createMeetingShortcut(int meetingIndex, boolean joinImmediately) {
@@ -383,7 +477,7 @@ public class MainActivity extends AppCompatActivity {
private void removeMeeting(int meeting) {
ArrayList meetings = getMeetings();
- if (meetings.size() > 0) {
+ if (meetings.size() > 0 && meeting != -1) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 33ed8ae..66514bd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -32,5 +32,12 @@
Meeting unter diesem Namen existiert schon. Bitte umbenennen, ansonsten wird es beim Speichern überschrieben
überschreiben
umbenennen
+ Bitte erlaube ZoomHelper, Apps zu installieren
+ Meeting aus Zwischenablage importieren
+ importierbares Meeting in Zwischenablage
+ IMPORTIEREN
+ Du musst das Meeting zunächst speichern, bevor du eine Verknüpfung dazu erstellen kannst
+ Meeting speichern
+ abbrechen
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index dfbc7c1..6ae1aaf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,6 +17,9 @@ allprojects {
google()
jcenter()
}
+ tasks.withType(JavaCompile) {
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+ }
}
task clean(type: Delete) {