Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
737e862
Activities ButtonsPresets, AvailableLayouts and ServerSettings added
EmmanuelAB Nov 17, 2017
3c40259
Merge pull request #71 from EmmanuelAB/develop
jamescr Nov 17, 2017
5b30e26
layout synchronization done
EmmanuelAB Nov 17, 2017
0a9ff66
Merge pull request #74 from EmmanuelAB/sincronizar_layout
adam3497 Nov 17, 2017
a3e645e
migrated to activities
EmmanuelAB Nov 24, 2017
d6a8aa0
Merge pull request #76 from EmmanuelAB/migrar_activities
jamescr Nov 24, 2017
82e6fa4
Hashtable is already added (#78)
adam3497 Nov 24, 2017
dc9866e
adapted to hash functionality
EmmanuelAB Nov 24, 2017
deede36
Merge pull request #79 from EmmanuelAB/hash
jamescr Nov 27, 2017
99ce864
The pop-up for the downloaded layouts from ButtonsPresets activity wa…
adam3497 Dec 5, 2017
4b4ffaf
The delete functionality was added to the Popup
adam3497 Dec 7, 2017
9184df3
Merge pull request #84 from altaros97/issue_81
aton1698 Dec 8, 2017
21291ac
A custom layout utils was added
adam3497 Dec 8, 2017
ed740b6
Merge pull request #85 from altaros97/convert_utils
jamescr Dec 8, 2017
b6ed52e
read available layouts from custom layouts server
jamescr Dec 8, 2017
dbd9d20
Merge pull request #83 from jamescr/issue_65
aton1698 Dec 8, 2017
3ec1db6
Some changes for Download Custom Layout (#92)
aton1698 Dec 15, 2017
5ac7e77
language checking when downloading
EmmanuelAB Dec 8, 2017
e20cc14
Github Repository Settings added
adam3497 Dec 15, 2017
21253cc
Merge pull request #87 from EmmanuelAB/merge
aton1698 Dec 15, 2017
f0bba6d
Merge branch 'develop' into repository_settings
adam3497 Dec 15, 2017
a22ac20
Merge branch 'develop' into repository_settings
adam3497 Dec 15, 2017
2f4df3f
Merge pull request #95 from altaros97/repository_settings
jamescr Dec 15, 2017
3553190
Update and install added
adam3497 Dec 15, 2017
3a8d135
Merge pull request #99 from altaros97/update_and_install
jamescr Dec 15, 2017
493d197
download from Availables
EmmanuelAB Dec 15, 2017
487bca7
Merge pull request #101 from EmmanuelAB/nueva
jamescr Dec 15, 2017
56c001c
Adds a URL Creator
jamescr Dec 18, 2017
8a3f2b3
fix error when looking for avalable layouts for the first time
jamescr Jan 19, 2018
ee4c8f7
fix images of layouts with spaces on their name
jamescr Jan 19, 2018
d1144b2
fix
EmmanuelAB Jan 17, 2018
b97c892
Merge pull request #102 from jamescr/issue_89
aton1698 Jan 19, 2018
573073c
Fix the update and install functionality
aton1698 Jan 19, 2018
90119e7
Merge pull request #106 from aton1698/develop
adam3497 Jan 19, 2018
648c8a3
works
EmmanuelAB Jan 17, 2018
a99653c
fix
EmmanuelAB Jan 17, 2018
69f4c4e
fix error when stora_dir value is changed
jamescr Jan 19, 2018
ad22e6d
Merge pull request #2 from jamescr/issue82_james
EmmanuelAB Jan 19, 2018
cd54e2f
Merge pull request #105 from EmmanuelAB/borrar
aton1698 Jan 19, 2018
94466fb
Merge pull request #104 from EmmanuelAB/issue82
adam3497 Jan 19, 2018
b6a2953
refresh in ButtonsPresets
EmmanuelAB Jan 19, 2018
02caf42
Merge pull request #107 from EmmanuelAB/refresh
aton1698 Jan 19, 2018
83b29a2
The button that launched the Available Layouts activity changed on Bu…
adam3497 Jan 19, 2018
fca9544
Merge pull request #108 from altaros97/develop
aton1698 Jan 19, 2018
d1f365f
shows an error when Internet is not available
jamescr Jan 19, 2018
a1eb9ed
Merge pull request #109 from jamescr/fix_no-internet
aton1698 Jan 19, 2018
9f16dab
it refreshes availables after setting server
EmmanuelAB Jan 24, 2018
15b5abd
Merge pull request #110 from EmmanuelAB/refresh
aton1698 Jan 24, 2018
2b36466
code readability improvements
adam3497 Feb 2, 2018
5f05785
Merge pull request #114 from altaros97/dev-labexperimental
EmmanuelAB Feb 2, 2018
333ea47
Improvements in Available layouts GUI
aton1698 Feb 2, 2018
823b48e
Language checking and downloading dialogs added
EmmanuelAB Feb 6, 2018
4c809b5
Merge branch 'develop' of https://github.com/LabExperimental-SIUA/osm…
aton1698 Feb 14, 2018
3a386bf
Merge branch 'develop' of https://github.com/aton1698/osmtracker-andr…
aton1698 Feb 14, 2018
e2137b1
Merge pull request #118 from aton1698/develop
adam3497 Feb 16, 2018
4e0090e
Merge pull request #119 from EmmanuelAB/progress
adam3497 Feb 16, 2018
b85818e
String tags added to translate
adam3497 Feb 24, 2018
d379f3e
Merge pull request #122 from altaros97/string_resources
aton1698 Mar 2, 2018
71b2cda
spanish translation corrections
adam3497 Mar 20, 2018
5f73e88
Merge pull request #1 from adam3497/string_fixes
aton1698 Apr 5, 2018
0708b17
domain changed to org.osmtracker (#2)
EmmanuelAB May 4, 2018
aa3d782
about link changed to redirect to labexp
EmmanuelAB May 11, 2018
0bdebe7
Merge pull request #7 from EmmanuelAB/about
jamescr May 11, 2018
48e5e91
Fix error: there is not default server (#5)
adam3497 Jun 1, 2018
0c70137
Add tags in every track (#8)
adam3497 Jun 1, 2018
2b52ac0
getLanguages and getDescription updated to process the new structure
EmmanuelAB May 10, 2018
a03bc60
Changes in parsing layouts file names and legibility mprovements. (#1)
xsaco07 May 25, 2018
5a388cc
Cambios en " DownloadCustomLayoutTask", "createLayoutFileUrl" y "crea…
aton1698 May 25, 2018
51ac1cf
merged last changes to consult the new structure
EmmanuelAB May 25, 2018
8f6bed0
Fixed error deleting icons folders
EmmanuelAB Jun 1, 2018
d1c1b68
Merge pull request #10 from adam3497/fix_parsers
aton1698 Jun 21, 2018
b472623
Correct checkboxes dialog when user cancels the action (#11)
xsaco07 Jun 23, 2018
d449400
domain changed to org.osmtracker
EmmanuelAB Feb 22, 2018
71e800e
Update Gradle Wrapper to version 4.5
floscher Jan 25, 2018
014f6ef
Update Gradle notation for dependencies and plugins
floscher Jan 25, 2018
9195d3d
Fix Travis build
floscher Jan 25, 2018
5d2e5c2
Fix when upload GPX data to OSM (error 500)
adam3497 Jun 1, 2018
978ee7a
change path name
jamescr Jun 9, 2018
773b6ec
various fixes in order to publish app in play store
jamescr Jun 9, 2018
96286b8
support android 6 permission system - gps and write external
jamescr Jun 13, 2018
974d8ab
support android 6 permission system - camera, audio and write external
jamescr Jun 14, 2018
f2fb8ef
support android 6 permission system - read external. Fix cancel butt…
jamescr Jun 16, 2018
e89479a
update urls in readme
jamescr Jun 21, 2018
47593c4
download custom layouts functionality moved to net.android package an…
jamescr Jun 29, 2018
e475bb8
Merge branch 'master' into master_and_fork
jamescr Jun 29, 2018
baaa75a
Changing the application icon
aton1698 Jun 29, 2018
80a6ac4
Merge pull request #2 from aton1698/new-app-icon
jamescr Jun 29, 2018
d5e37f4
fixes hanshake exception in URLValidatorTask
EmmanuelAB Jun 29, 2018
84f748f
Merge pull request #3 from EmmanuelAB/fix_handshake
jamescr Jun 29, 2018
b39f201
change to version 0.7 (code 41)
jamescr Jun 29, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.osmtracker"
android:versionName="0.6.12" android:versionCode="40" android:installLocation="auto">
android:versionName="0.7" android:versionCode="41" android:installLocation="auto">

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Expand Down Expand Up @@ -34,7 +34,15 @@
<activity android:name="net.osmtracker.activity.About" android:label="@string/about" />
<activity android:name="net.osmtracker.activity.DisplayTrack" android:label="@string/displaytrack" />
<activity android:name="net.osmtracker.activity.DisplayTrackMap" android:label="@string/displaytrackmap" />

<activity android:name="net.osmtracker.activity.ButtonsPresets">
<intent-filter>
<action android:name="launch_buttons_presets"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="net.osmtracker.activity.AvailableLayouts">
</activity>

<service android:name="net.osmtracker.service.gps.GPSLogger" android:exported="false">
<intent-filter>
<action android:name="osmtracker.intent.GPS_SERVICE" />
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/net/osmtracker/OSMTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ public static final class Preferences {
public final static String KEY_OSM_OAUTH_SECRET = "osm.oauth.secret";
public final static String KEY_OSM_OAUTH_CLEAR_DATA = "osm.oauth.clear-data";

//keys for repository settings
public final static String KEY_GITHUB_USERNAME = "github_username";
public final static String KEY_REPOSITORY_NAME = "repository_name";
public final static String KEY_BRANCH_NAME = "branch_name";

// Default values
public final static String VAL_STORAGE_DIR = "/osmtracker";
public final static String VAL_VOICEREC_DURATION = "2";
Expand Down Expand Up @@ -82,6 +87,11 @@ public static final class Preferences {
public final static String VAL_UI_ORIENTATION = VAL_UI_ORIENTATION_NONE;

public final static String VAL_UI_MAP_TILE_MAPNIK = "MAPNIK";

//default values for repository settings
public final static String VAL_GITHUB_USERNAME = "labexp";
public final static String VAL_REPOSITORY_NAME = "osmtracker-android-layouts";
public final static String VAL_BRANCH_NAME = "master";

};

Expand Down
505 changes: 505 additions & 0 deletions app/src/main/java/net/osmtracker/activity/AvailableLayouts.java

Large diffs are not rendered by default.

355 changes: 355 additions & 0 deletions app/src/main/java/net/osmtracker/activity/ButtonsPresets.java

Large diffs are not rendered by default.

131 changes: 23 additions & 108 deletions app/src/main/java/net/osmtracker/activity/Preferences.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;

import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
Expand All @@ -21,9 +22,7 @@
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;


/**
* Manages preferences screen.
Expand All @@ -35,8 +34,6 @@ public class Preferences extends PreferenceActivity {

@SuppressWarnings("unused")
private static final String TAG = Preferences.class.getSimpleName();

final private int RC_READ_PERMISSION = 1;

/**
* Directory containing user layouts, relative to storage dir.
Expand All @@ -46,17 +43,26 @@ public class Preferences extends PreferenceActivity {
/**
* File extension for layout files
*/
private static final String LAYOUT_FILE_EXTENSION = ".xml";


public static final String LAYOUT_FILE_EXTENSION = ".xml";

/**
* The suffix that must be added to the layout's name for getting its icons directory
* Example: water_supply <- layout name
* water_supply_icons <- icon directory
*/

public static final String ICONS_DIR_SUFFIX = "_icons";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);

// Set summary of some preferences to their actual values
// and register a change listener to set again the summary in case of change
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

// External storage directory
EditTextPreference storageDirPref = (EditTextPreference) findPreference(OSMTracker.Preferences.KEY_STORAGE_DIR);
storageDirPref.setSummary(prefs.getString(OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR));
Expand All @@ -67,44 +73,14 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
if (! ((String) newValue).startsWith(File.separator)) {
newValue = File.separator + (String) newValue;
}

// Set summary with the directory value
preference.setSummary((String) newValue);

// Re-populate layout list preference
populateLayoutPreference((String) newValue);

// Set layout to default layout
((ListPreference) findPreference(OSMTracker.Preferences.KEY_UI_BUTTONS_LAYOUT)).setValue(OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT);

return true;
}
});

if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {

// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
// TODO: explain why we need permission.
Log.w(TAG, "we should explain why we need read permission");

} else {

// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, RC_READ_PERMISSION);
}

} else {
populateLayoutPreference(storageDirPref.getText());
}


// Voice record duration
Preference pref = findPreference(OSMTracker.Preferences.KEY_VOICEREC_DURATION);
pref.setSummary(prefs.getString(OSMTracker.Preferences.KEY_VOICEREC_DURATION, OSMTracker.Preferences.VAL_VOICEREC_DURATION) + " " + getResources().getString(R.string.prefs_voicerec_duration_seconds));
Expand All @@ -116,13 +92,13 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
return true;
}
});

// Update GPS logging interval summary to the current value
pref = findPreference(OSMTracker.Preferences.KEY_GPS_LOGGING_INTERVAL);
pref.setSummary(
prefs.getString(OSMTracker.Preferences.KEY_GPS_LOGGING_INTERVAL, OSMTracker.Preferences.VAL_GPS_LOGGING_INTERVAL)
+ " " + getResources().getString(R.string.prefs_gps_logging_interval_seconds)
+ ". " + getResources().getString(R.string.prefs_gps_logging_interval_summary));
+ " " + getResources().getString(R.string.prefs_gps_logging_interval_seconds)
+ ". " + getResources().getString(R.string.prefs_gps_logging_interval_summary));
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Expand Down Expand Up @@ -151,7 +127,7 @@ public boolean onPreferenceClick(Preference preference) {
String displayValue = orientationListPreference.getEntries()[displayValueIndex].toString();
orientationListPreference.setSummary(displayValue + ".\n"
+ getResources().getString(R.string.prefs_ui_orientation_summary));

// Set a listener to update the preference display after a change is made
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
Expand All @@ -161,7 +137,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
// Pull the display string from the list preference rather than simply using the key value
int newValueIndex = orientationListPreference.findIndexOfValue((String)newValue);
String newPreferenceDisplayValue = orientationListPreference.getEntries()[newValueIndex].toString();

preference.setSummary(newPreferenceDisplayValue
+ ".\n" + getResources().getString(R.string.prefs_ui_orientation_summary));
return true;
Expand All @@ -184,73 +160,12 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
editor.remove(OSMTracker.Preferences.KEY_OSM_OAUTH_TOKEN);
editor.remove(OSMTracker.Preferences.KEY_OSM_OAUTH_SECRET);
editor.commit();

preference.setEnabled(false);
return false;
}
});

}

/**
* Populates the user layout list preference.
* @param storageDir Where to find layout files
*/
private void populateLayoutPreference(String storageDir) {
// Populate layout lists reading available layouts from external storage
ListPreference lf = (ListPreference) findPreference(OSMTracker.Preferences.KEY_UI_BUTTONS_LAYOUT);
String[] entries;
String[] values;

// Check for presence of layout directory
File layoutsDir = new File(Environment.getExternalStorageDirectory(), storageDir + File.separator + LAYOUTS_SUBDIR + File.separator);
if (layoutsDir.exists() && layoutsDir.canRead()) {
// List each layout file
String[] layoutFiles = layoutsDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.endsWith(LAYOUT_FILE_EXTENSION);
}
});
// Create array of values for each layout file + the default one
entries = new String[layoutFiles.length+1];
values = new String[layoutFiles.length+1];
entries[0] = getResources().getString(R.string.prefs_ui_buttons_layout_defaut);
values[0] = OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT;
for (int i=0; i<layoutFiles.length; i++) {
entries[i+1] = layoutFiles[i].substring(0, layoutFiles[i].length()-LAYOUT_FILE_EXTENSION.length());
values[i+1] = layoutFiles[i];
}
} else {
// No layout found, populate values with just the default entry.
entries = new String[] {getResources().getString(R.string.prefs_ui_buttons_layout_defaut)};
values = new String[] {OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT};
}
lf.setEntries(entries);
lf.setEntryValues(values);
}

public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case RC_READ_PERMISSION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay!
EditTextPreference storageDirPref = (EditTextPreference) findPreference(OSMTracker.Preferences.KEY_STORAGE_DIR);
populateLayoutPreference(storageDirPref.getText());

} else {

// permission denied, boo! Disable the
// functionality that depends on this permission.
//TODO: add an informative message.
Log.w(TAG, "we should explain why we need read permission");
}
}
}
}

}
65 changes: 61 additions & 4 deletions app/src/main/java/net/osmtracker/activity/TrackLogger.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package net.osmtracker.activity;

import java.io.File;

import java.util.ArrayList;
import java.util.Date;

import net.osmtracker.OSMTracker;
Expand All @@ -12,17 +14,23 @@
import net.osmtracker.receiver.MediaButtonReceiver;
import net.osmtracker.service.gps.GPSLogger;
import net.osmtracker.service.gps.GPSLoggerServiceConnection;
import net.osmtracker.util.CustomLayoutsUtils;
import net.osmtracker.util.FileSystemUtils;
import net.osmtracker.util.ThemeValidator;
import net.osmtracker.view.TextNoteDialog;
import net.osmtracker.view.VoiceRecDialog;
import net.osmtracker.db.TrackContentProvider;

import android.Manifest;
import android.annotation.TargetApi;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.ContentUris;
import android.content.ContentValues;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
Expand All @@ -34,6 +42,8 @@
import android.location.LocationManager;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;

import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
Expand Down Expand Up @@ -153,14 +163,20 @@ public class TrackLogger extends Activity {
private AudioManager mAudioManager;

private ComponentName mediaButtonReceiver;


private ArrayList<String> layoutNameTags = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {

// Get the track id to work with
currentTrackId = getIntent().getExtras().getLong(TrackContentProvider.Schema.COL_TRACK_ID);
Log.v(TAG, "Starting for track id " + currentTrackId);


//save the initial layout file name in tags array
String layoutName = CustomLayoutsUtils.getCurrentLayoutName(getApplicationContext());
layoutNameTags.add(layoutName);

gpsLoggerServiceIntent = new Intent(this, GPSLogger.class);
gpsLoggerServiceIntent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, currentTrackId);

Expand Down Expand Up @@ -193,6 +209,40 @@ protected void onCreate(Bundle savedInstanceState) {
mediaButtonReceiver = new ComponentName(this, MediaButtonReceiver.class.getName());
}

/**
* It takes the string array layoutNameTags and convert each position in the array, then, create a string with all the tags separated with a comma.
* Also, the default layout is excluded and the 'osmtracker' tag is added by default.
*/
private void saveTagsForTrack(){
StringBuilder tags = new StringBuilder();
ArrayList<String> fixedTags = new ArrayList<String>();

//covert the file name to simple layout name
for(String layoutFileName : layoutNameTags){
//OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT -> 'default'
if(! layoutFileName.equals(OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT)){
fixedTags.add(CustomLayoutsUtils.convertFileName(layoutFileName));
}
}

fixedTags.add("osmtracker");

//create the string with all tags
for(String simpleName : fixedTags){
tags.append(simpleName).append(",");
}

//obtain the current track id and initialize the values variable
Uri trackUri = ContentUris.withAppendedId(TrackContentProvider.CONTENT_URI_TRACK, currentTrackId);
ContentValues values = new ContentValues();

//set the values tag and update the table
values.put(TrackContentProvider.Schema.COL_TAGS, tags.toString());
getContentResolver().update(trackUri, values, null, null);
}


@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onResume() {

Expand Down Expand Up @@ -268,6 +318,12 @@ protected void onResume() {

mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);

//save the layout file name if it change, in tags array
String layoutName = CustomLayoutsUtils.getCurrentLayoutName(getApplicationContext());
if(! layoutNameTags.contains(layoutName)){
layoutNameTags.add(layoutName);
}

super.onResume();
}

Expand Down Expand Up @@ -376,6 +432,8 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.tracklogger_menu_stoptracking:
// Start / Stop tracking
if (gpsLogger.isTracking()) {
saveTagsForTrack();

Intent intent = new Intent(OSMTracker.INTENT_STOP_TRACKING);
sendBroadcast(intent);
((GpsStatusRecord) findViewById(R.id.gpsStatus)).manageRecordingIndicator(false);
Expand Down Expand Up @@ -763,5 +821,4 @@ public void onRequestPermissionsResult(int requestCode,
}
}


}
Loading