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) {