Skip to content

Commit aecdb50

Browse files
authored
Merge pull request #69 from ngageoint/develop
v2.1.8 release
2 parents 2969bd2 + 3e4b202 commit aecdb50

File tree

13 files changed

+521
-324
lines changed

13 files changed

+521
-324
lines changed

mapcache/build.gradle

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def googleMapsApiReleaseKey = hasProperty('RELEASE_MAPS_MAPCACHE_API_KEY') ? REL
44
def googleMapsApiKeyDebug = hasProperty('DEBUG_MAPS_API_KEY') ? DEBUG_MAPS_API_KEY : ''
55

66
android {
7-
compileSdkVersion 31
7+
compileSdkVersion 33
88

99
compileOptions {
1010
sourceCompatibility JavaVersion.VERSION_11
@@ -14,9 +14,9 @@ android {
1414
applicationId "mil.nga.mapcache"
1515
resValue "string", "applicationId", applicationId
1616
minSdkVersion 28
17-
targetSdkVersion 31
18-
versionCode 53
19-
versionName '2.1.7'
17+
targetSdkVersion 33
18+
versionCode 55
19+
versionName '2.1.8'
2020
multiDexEnabled true
2121
}
2222
buildTypes {
@@ -38,6 +38,13 @@ android {
3838
exclude 'META-INF/NOTICE'
3939
exclude 'META-INF/NOTICE.txt'
4040
}
41+
sourceSets {
42+
main {
43+
java {
44+
srcDirs 'src/main/java', 'src/test'
45+
}
46+
}
47+
}
4148
}
4249

4350
task androidAppVersion {
@@ -51,7 +58,7 @@ dependencies {
5158
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
5259
api 'androidx.appcompat:appcompat:1.3.0'
5360
api 'com.google.android.material:material:1.6.0'
54-
api 'androidx.preference:preference:1.2.0'
61+
api 'androidx.preference:preference:1.2.1'
5562
api 'androidx.lifecycle:lifecycle-extensions:2.2.0'
5663
api 'mil.nga.geopackage.map:geopackage-android-map:6.7.1' // comment out to build locally
5764
//api project(':geopackage-map') // uncomment me to build locally
@@ -64,8 +71,10 @@ dependencies {
6471
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
6572
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01'
6673
implementation 'org.locationtech.jts:jts-core:1.18.2'
74+
implementation 'junit:junit:4.12'
6775
testImplementation 'androidx.multidex:multidex:2.0.1'
6876
testImplementation 'junit:junit:4.13.1'
77+
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
6978
implementation 'com.github.matomo-org:matomo-sdk-android:v2.0.0'
7079
}
7180

mapcache/src/main/java/mil/nga/mapcache/GeoPackageMapFragment.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import android.os.Looper;
2020
import android.os.VibrationEffect;
2121
import android.os.Vibrator;
22-
import android.preference.PreferenceManager;
22+
import androidx.preference.PreferenceManager;
2323
import android.text.Editable;
2424
import android.text.InputType;
2525
import android.text.TextWatcher;
@@ -100,6 +100,7 @@
100100
import org.jetbrains.annotations.NotNull;
101101
import org.locationtech.proj4j.units.Units;
102102

103+
import java.io.File;
103104
import java.lang.reflect.Method;
104105
import java.sql.SQLException;
105106
import java.text.DecimalFormat;
@@ -160,6 +161,7 @@
160161
import mil.nga.mapcache.listeners.OnDialogButtonClickListener;
161162
import mil.nga.mapcache.listeners.SensorCallback;
162163
import mil.nga.mapcache.load.DownloadTask;
164+
import mil.nga.mapcache.load.Downloader;
163165
import mil.nga.mapcache.load.ILoadTilesTask;
164166
import mil.nga.mapcache.load.ImportTask;
165167
import mil.nga.mapcache.load.ShareTask;
@@ -592,6 +594,8 @@ private enum EditType {
592594
*/
593595
ActivityResultLauncher<Intent> importGeoPackageActivityResultLauncher;
594596
ActivityResultLauncher<Intent> preferencePageActivityResultLauncher;
597+
ActivityResultLauncher<Intent> downloadTaskResultLauncher;
598+
595599

596600

597601
/**
@@ -1076,7 +1080,10 @@ public void onRenameGP(String oldName, String newName) {
10761080
public void onShareGP(String gpName) {
10771081
// Set the geopackage name before we ask permissions and get routed back through MainActivity
10781082
// to exportGeoPackageToExternal()
1083+
File databaseFile = geoPackageViewModel.getDatabaseFile(gpName);
1084+
shareTask.setFileExternal(geoPackageViewModel.isExternal(gpName));
10791085
shareTask.setGeoPackageName(gpName);
1086+
shareTask.setGeoPackageFile(databaseFile);
10801087
getImportPermissions(MainActivity.MANAGER_PERMISSIONS_REQUEST_ACCESS_EXPORT_DATABASE);
10811088
}
10821089

@@ -1842,7 +1849,7 @@ public void showMapIcons() {
18421849
ViewAnimation.rotateFadeIn(settingsIcon, 200);
18431850
layerFab.show();
18441851
}
1845-
1852+
18461853

18471854
/**
18481855
* Launches a wizard to create a new tile layer in the given geopackage
@@ -1900,8 +1907,10 @@ public void importGeopackageFromFile() {
19001907
* Save a GeoPackage to external disk (after we've been given permission)
19011908
*/
19021909
public void exportGeoPackageToExternal() {
1903-
if (shareTask != null && shareTask.getGeoPackageName() != null) {
1904-
shareTask.askToSaveOrShare(shareTask.getGeoPackageName());
1910+
1911+
if (shareTask != null && shareTask.getGeoPackageName() != null &&
1912+
shareTask.getGeoPackageFile() != null) {
1913+
shareTask.askToSaveOrShare();
19051914
}
19061915
}
19071916

@@ -2026,9 +2035,11 @@ public View getView(int position, View convertView, ViewGroup parent) {
20262035
if (nameValid && urlValid) {
20272036
String database = inputName.getText() != null ? inputName.getText().toString() : "";
20282037
String url = inputUrl.getText() != null ? inputUrl.getText().toString() : "";
2029-
DownloadTask downloadTask = new DownloadTask(database, url, getActivity());
2030-
2031-
downloadTask.execute();
2038+
// Use new Downloader to import the GeoPackage
2039+
Downloader geoPackageDownloader = new Downloader(getActivity());
2040+
geoPackageDownloader.downloadGeoPackage(geoPackageViewModel, url, database);
2041+
// DownloadTask downloadTask = new DownloadTask(database, url, getActivity());
2042+
// downloadTask.execute();
20322043
alertDialog.dismiss();
20332044
} else if (!nameValid) {
20342045
inputName.requestFocus();

mapcache/src/main/java/mil/nga/mapcache/data/GeoPackageDatabases.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import android.content.Context;
55
import android.content.SharedPreferences;
66
import android.content.SharedPreferences.Editor;
7-
import android.preference.PreferenceManager;
7+
import androidx.preference.PreferenceManager;
88
import android.util.Log;
99

1010
import java.io.FileInputStream;

mapcache/src/main/java/mil/nga/mapcache/io/MapCacheFileUtils.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,22 @@ public static String getDisplayName(Context context, Uri uri, String path) {
5151
* @param uri
5252
* @return
5353
*/
54-
@TargetApi(Build.VERSION_CODES.KITKAT)
5554
private static String getDisplayName(Context context, Uri uri) {
5655

5756
String name = null;
5857

59-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
60-
ContentResolver resolver = context.getContentResolver();
61-
Cursor nameCursor = resolver.query(uri, null, null, null, null);
62-
try {
63-
if (nameCursor.getCount() > 0) {
64-
int displayNameIndex = nameCursor
65-
.getColumnIndex(DocumentsContract.Document.COLUMN_DISPLAY_NAME);
66-
if (displayNameIndex >= 0 && nameCursor.moveToFirst()) {
67-
name = nameCursor.getString(displayNameIndex);
68-
}
58+
ContentResolver resolver = context.getContentResolver();
59+
Cursor nameCursor = resolver.query(uri, null, null, null, null);
60+
try {
61+
if (nameCursor.getCount() > 0) {
62+
int displayNameIndex = nameCursor
63+
.getColumnIndex(DocumentsContract.Document.COLUMN_DISPLAY_NAME);
64+
if (displayNameIndex >= 0 && nameCursor.moveToFirst()) {
65+
name = nameCursor.getString(displayNameIndex);
6966
}
70-
} finally {
71-
nameCursor.close();
7267
}
68+
} finally {
69+
nameCursor.close();
7370
}
7471

7572
if (name == null) {
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package mil.nga.mapcache.load
2+
3+
import android.app.AlertDialog
4+
import android.os.Looper
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.widget.TextView
8+
import androidx.appcompat.widget.AppCompatImageView
9+
import androidx.fragment.app.FragmentActivity
10+
import mil.nga.geopackage.io.GeoPackageProgress
11+
import mil.nga.mapcache.R
12+
import mil.nga.mapcache.viewmodel.GeoPackageViewModel
13+
import java.net.URL
14+
import java.util.concurrent.ExecutorService
15+
import java.util.concurrent.Executors
16+
17+
/**
18+
* Downloads a GeoPackage via the GeoPackageViewModel, providing feedback and cancel action via
19+
* an AlertDialog
20+
*/
21+
class Downloader(val activity : FragmentActivity) : GeoPackageProgress{
22+
23+
private var max: Int = 0
24+
private var progress: Int = 0
25+
private val alertDialog: AlertDialog
26+
private val myExecutor: ExecutorService = Executors.newSingleThreadExecutor()
27+
private var geoPackageName : String = ""
28+
29+
/**
30+
* Create the alert dialog
31+
*/
32+
init {
33+
val builder = AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
34+
35+
// Create Alert window with basic input text layout
36+
val inflater = LayoutInflater.from(activity)
37+
val alertView: View = inflater.inflate(R.layout.basic_label_alert, null)
38+
39+
// Set dialog view info
40+
val alertLogo = alertView.findViewById<AppCompatImageView>(R.id.alert_logo)
41+
alertLogo.setImageResource(R.drawable.material_add_box)
42+
val titleText = alertView.findViewById<TextView>(R.id.alert_title)
43+
titleText.setText(R.string.import_geopackage_url)
44+
val actionLabel = alertView.findViewById<View>(R.id.action_label) as TextView
45+
actionLabel.setText("Importing GeoPackage")
46+
actionLabel.visibility = View.VISIBLE
47+
48+
// Cancel button
49+
builder.setPositiveButton("Cancel") {alertDialog, which ->
50+
myExecutor.shutdownNow()
51+
}
52+
53+
builder.setView(alertView)
54+
builder.setCancelable(false)
55+
alertDialog = builder.create()
56+
}
57+
58+
59+
/**
60+
* Ask the viewmodel to download the given database from the given url. Show the alert dialog
61+
* and allow cancel
62+
*/
63+
fun downloadGeoPackage(viewModel : GeoPackageViewModel, url : String, database : String){
64+
val handler = android.os.Handler(Looper.getMainLooper())
65+
val theUrl = URL(url)
66+
var completeMessage : String = "Import failed"
67+
geoPackageName = database
68+
alertDialog.show()
69+
myExecutor.submit {
70+
try {
71+
if (!viewModel.importGeoPackage(database, theUrl, this)) {
72+
completeMessage = "Failed to import GeoPackage '$database' at url '$url'"
73+
} else {
74+
completeMessage = "GeoPackage imported"
75+
}
76+
} catch (e: InterruptedException){
77+
Thread.currentThread().interrupt()
78+
}
79+
handler.post {
80+
alertDialog.dismiss()
81+
}
82+
}
83+
}
84+
85+
/**
86+
* Sets the max download
87+
*/
88+
override fun setMax(max: Int) {
89+
this.max = max
90+
}
91+
92+
/**
93+
* Add download progress, then update the alert dialog
94+
*/
95+
override fun addProgress(progress: Int) {
96+
this.progress += progress
97+
val percentComplete = (this.progress / max.toDouble() * 100).toInt()
98+
val actionLabel = alertDialog.findViewById<View>(R.id.action_label) as TextView
99+
actionLabel.text = "Importing $geoPackageName: $percentComplete%"
100+
}
101+
102+
override fun isActive(): Boolean {
103+
return true
104+
}
105+
106+
override fun cleanupOnCancel(): Boolean {
107+
return true
108+
}
109+
}

0 commit comments

Comments
 (0)