forked from upstream-mirrors/OpenTracks
Add option to share as a file.
This commit is contained in:
@@ -31,6 +31,7 @@ limitations under the License.
|
|||||||
<string name="chart_show_speed_key">chartShowSpeed</string>
|
<string name="chart_show_speed_key">chartShowSpeed</string>
|
||||||
<string name="confirm_play_earth_key">confirmPlayEarth</string>
|
<string name="confirm_play_earth_key">confirmPlayEarth</string>
|
||||||
<string name="confirm_share_drive_key">confirmShareDrive</string>
|
<string name="confirm_share_drive_key">confirmShareDrive</string>
|
||||||
|
<string name="confirm_share_file_key">confirmShareFile</string>
|
||||||
<string name="confirm_share_maps_key">confirmShareMaps</string>
|
<string name="confirm_share_maps_key">confirmShareMaps</string>
|
||||||
<string name="default_activity_key">defaultActivity</string>
|
<string name="default_activity_key">defaultActivity</string>
|
||||||
<string name="default_map_public_key">defaultMapPublic</string>
|
<string name="default_map_public_key">defaultMapPublic</string>
|
||||||
|
|||||||
@@ -2038,6 +2038,13 @@ limitations under the License.
|
|||||||
share via Google Drive.">
|
share via Google Drive.">
|
||||||
Via Google Drive
|
Via Google Drive
|
||||||
</string>
|
</string>
|
||||||
|
<string name="settings_sharing_share_track_file"
|
||||||
|
translation_description="In the 'Sharing' settings, the option in the 'Share track' setting to
|
||||||
|
share as a file.
|
||||||
|
|
||||||
|
%1$s: file format. E.g., 'GPX'.">
|
||||||
|
As %1$s file
|
||||||
|
</string>
|
||||||
<string name="settings_sharing_share_track_maps"
|
<string name="settings_sharing_share_track_maps"
|
||||||
translation_description="In the 'Sharing' settings, the option in the 'Share track' setting to
|
translation_description="In the 'Sharing' settings, the option in the 'Share track' setting to
|
||||||
share via Google Maps url.">
|
share via Google Maps url.">
|
||||||
@@ -2099,6 +2106,10 @@ limitations under the License.
|
|||||||
This will upload your track to Google Drive so you can share the file with friends. The file
|
This will upload your track to Google Drive so you can share the file with friends. The file
|
||||||
will be private and only those you have shared with will have access.
|
will be private and only those you have shared with will have access.
|
||||||
</string>
|
</string>
|
||||||
|
<string name="share_track_file_confirm_message"
|
||||||
|
translation_description="The confirmation message when sharing a track as a file.">
|
||||||
|
This will save your track to external storage so you can share the file.
|
||||||
|
</string>
|
||||||
<string name="share_track_maps_confirm_message"
|
<string name="share_track_maps_confirm_message"
|
||||||
translation_description="The confirmation message when sharing a track via Google Maps with
|
translation_description="The confirmation message when sharing a track via Google Maps with
|
||||||
friends.
|
friends.
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment.C
|
|||||||
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
|
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
|
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
|
||||||
import com.google.android.apps.mytracks.io.drive.SendDriveActivity;
|
import com.google.android.apps.mytracks.io.drive.SendDriveActivity;
|
||||||
|
import com.google.android.apps.mytracks.io.file.SaveActivity;
|
||||||
|
import com.google.android.apps.mytracks.io.file.TrackFileFormat;
|
||||||
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesActivity;
|
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesActivity;
|
||||||
import com.google.android.apps.mytracks.io.gdata.maps.MapsConstants;
|
import com.google.android.apps.mytracks.io.gdata.maps.MapsConstants;
|
||||||
import com.google.android.apps.mytracks.io.maps.ChooseMapActivity;
|
import com.google.android.apps.mytracks.io.maps.ChooseMapActivity;
|
||||||
@@ -52,6 +54,7 @@ import android.app.Activity;
|
|||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@@ -338,36 +341,63 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
|
|||||||
protected void confirmShare(long trackId) {
|
protected void confirmShare(long trackId) {
|
||||||
String shareTrack = PreferencesUtils.getString(
|
String shareTrack = PreferencesUtils.getString(
|
||||||
this, R.string.share_track_key, PreferencesUtils.SHARE_TRACK_DEFAULT);
|
this, R.string.share_track_key, PreferencesUtils.SHARE_TRACK_DEFAULT);
|
||||||
if (shareTrack.equals(PreferencesUtils.SHARE_TRACK_DEFAULT)) {
|
String driveValue = getString(R.string.settings_sharing_share_track_drive_value);
|
||||||
|
String mapsValue = getString(R.string.settings_sharing_share_track_maps_value);
|
||||||
|
if (shareTrack.equals(driveValue)) {
|
||||||
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
|
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
|
||||||
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
|
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
|
||||||
getString(R.string.share_track_drive_confirm_message), trackId)
|
getString(R.string.share_track_drive_confirm_message), trackId)
|
||||||
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
|
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
|
||||||
} else {
|
} else if (shareTrack.equals(mapsValue)) {
|
||||||
ConfirmDialogFragment.newInstance(R.string.confirm_share_maps_key,
|
ConfirmDialogFragment.newInstance(R.string.confirm_share_maps_key,
|
||||||
PreferencesUtils.CONFIRM_SHARE_MAPS_DEFAULT, StringUtils.getHtml(this,
|
PreferencesUtils.CONFIRM_SHARE_MAPS_DEFAULT, StringUtils.getHtml(
|
||||||
R.string.share_track_maps_confirm_message, R.string.maps_public_unlisted_url),
|
this, R.string.share_track_maps_confirm_message, R.string.maps_public_unlisted_url),
|
||||||
trackId).show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
|
trackId).show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
|
||||||
}
|
} else {
|
||||||
|
ConfirmDialogFragment.newInstance(R.string.confirm_share_file_key,
|
||||||
|
PreferencesUtils.CONFIRM_SHARE_FILE_DEFAULT,
|
||||||
|
getString(R.string.share_track_file_confirm_message), trackId)
|
||||||
|
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConfirmDone(int confirmId, long trackId) {
|
public void onConfirmDone(int confirmId, long trackId) {
|
||||||
|
SendRequest newRequest;
|
||||||
switch (confirmId) {
|
switch (confirmId) {
|
||||||
case R.string.confirm_share_drive_key:
|
case R.string.confirm_share_drive_key:
|
||||||
AnalyticsUtils.sendPageViews(this, "/action/share_drive");
|
AnalyticsUtils.sendPageViews(this, "/action/share_drive");
|
||||||
SendRequest sendRequest = new SendRequest(trackId);
|
newRequest = new SendRequest(trackId);
|
||||||
sendRequest.setSendDrive(true);
|
newRequest.setSendDrive(true);
|
||||||
sendRequest.setDriveShare(true);
|
newRequest.setDriveShare(true);
|
||||||
sendToGoogle(sendRequest);
|
sendToGoogle(newRequest);
|
||||||
break;
|
break;
|
||||||
case R.string.confirm_share_maps_key:
|
case R.string.confirm_share_maps_key:
|
||||||
AnalyticsUtils.sendPageViews(this, "/action/share_maps");
|
AnalyticsUtils.sendPageViews(this, "/action/share_maps");
|
||||||
sendRequest = new SendRequest(trackId);
|
newRequest = new SendRequest(trackId);
|
||||||
sendRequest.setSendMaps(true);
|
newRequest.setSendMaps(true);
|
||||||
sendRequest.setMapsShare(true);
|
newRequest.setMapsShare(true);
|
||||||
sendToGoogle(sendRequest);
|
sendToGoogle(newRequest);
|
||||||
break;
|
break;
|
||||||
|
case R.string.confirm_share_file_key:
|
||||||
|
String shareTrack = PreferencesUtils.getString(
|
||||||
|
this, R.string.share_track_key, PreferencesUtils.SHARE_TRACK_DEFAULT);
|
||||||
|
TrackFileFormat trackFileFormat;
|
||||||
|
if (shareTrack.equals(TrackFileFormat.GPX.name())) {
|
||||||
|
trackFileFormat = TrackFileFormat.GPX;
|
||||||
|
} else if (shareTrack.equals(TrackFileFormat.KML.name())) {
|
||||||
|
trackFileFormat = TrackFileFormat.KML;
|
||||||
|
} else if (shareTrack.equals(TrackFileFormat.CSV.name())) {
|
||||||
|
trackFileFormat = TrackFileFormat.CSV;
|
||||||
|
} else {
|
||||||
|
trackFileFormat = TrackFileFormat.TCX;
|
||||||
|
}
|
||||||
|
Intent intent = IntentUtils.newIntent(this, SaveActivity.class)
|
||||||
|
.putExtra(SaveActivity.EXTRA_TRACK_ID, trackId)
|
||||||
|
.putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) trackFileFormat)
|
||||||
|
.putExtra(SaveActivity.EXTRA_SHARE_TRACK, true);
|
||||||
|
startActivity(intent);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public class SaveActivity extends Activity {
|
|||||||
public static final String EXTRA_TRACK_FILE_FORMAT = "track_file_format";
|
public static final String EXTRA_TRACK_FILE_FORMAT = "track_file_format";
|
||||||
public static final String EXTRA_TRACK_ID = "track_id";
|
public static final String EXTRA_TRACK_ID = "track_id";
|
||||||
public static final String EXTRA_PLAY_TRACK = "play_track";
|
public static final String EXTRA_PLAY_TRACK = "play_track";
|
||||||
|
public static final String EXTRA_SHARE_TRACK = "share_track";
|
||||||
|
|
||||||
public static final String GOOGLE_EARTH_KML_MIME_TYPE = "application/vnd.google-earth.kml+xml";
|
public static final String GOOGLE_EARTH_KML_MIME_TYPE = "application/vnd.google-earth.kml+xml";
|
||||||
public static final String GOOGLE_EARTH_PACKAGE = "com.google.earth";
|
public static final String GOOGLE_EARTH_PACKAGE = "com.google.earth";
|
||||||
@@ -59,6 +60,7 @@ public class SaveActivity extends Activity {
|
|||||||
private TrackFileFormat trackFileFormat;
|
private TrackFileFormat trackFileFormat;
|
||||||
private long trackId;
|
private long trackId;
|
||||||
private boolean playTrack;
|
private boolean playTrack;
|
||||||
|
private boolean shareTrack;
|
||||||
private String directoryName;
|
private String directoryName;
|
||||||
|
|
||||||
private SaveAsyncTask saveAsyncTask;
|
private SaveAsyncTask saveAsyncTask;
|
||||||
@@ -70,9 +72,6 @@ public class SaveActivity extends Activity {
|
|||||||
// the number of tracks to save
|
// the number of tracks to save
|
||||||
private int totalCount;
|
private int totalCount;
|
||||||
|
|
||||||
// the last successfully saved path
|
|
||||||
private String savedPath;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -81,6 +80,7 @@ public class SaveActivity extends Activity {
|
|||||||
trackFileFormat = intent.getParcelableExtra(EXTRA_TRACK_FILE_FORMAT);
|
trackFileFormat = intent.getParcelableExtra(EXTRA_TRACK_FILE_FORMAT);
|
||||||
trackId = intent.getLongExtra(EXTRA_TRACK_ID, -1L);
|
trackId = intent.getLongExtra(EXTRA_TRACK_ID, -1L);
|
||||||
playTrack = intent.getBooleanExtra(EXTRA_PLAY_TRACK, false);
|
playTrack = intent.getBooleanExtra(EXTRA_PLAY_TRACK, false);
|
||||||
|
shareTrack = intent.getBooleanExtra(EXTRA_SHARE_TRACK, false);
|
||||||
|
|
||||||
if (!FileUtils.isExternalStorageWriteable()) {
|
if (!FileUtils.isExternalStorageWriteable()) {
|
||||||
Toast.makeText(this, R.string.external_storage_not_writable, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.external_storage_not_writable, Toast.LENGTH_LONG).show();
|
||||||
@@ -88,7 +88,7 @@ public class SaveActivity extends Activity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
directoryName = playTrack ? FileUtils.buildExternalDirectoryPath(
|
directoryName = playTrack || shareTrack ? FileUtils.buildExternalDirectoryPath(
|
||||||
trackFileFormat.getExtension(), "tmp")
|
trackFileFormat.getExtension(), "tmp")
|
||||||
: FileUtils.buildExternalDirectoryPath(trackFileFormat.getExtension());
|
: FileUtils.buildExternalDirectoryPath(trackFileFormat.getExtension());
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ public class SaveActivity extends Activity {
|
|||||||
success = false;
|
success = false;
|
||||||
message = getString(R.string.save_error, successCount, totalTracks, directoryName);
|
message = getString(R.string.save_error, successCount, totalTracks, directoryName);
|
||||||
}
|
}
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this).setCancelable(true).setIcon(
|
return new AlertDialog.Builder(this).setCancelable(true).setIcon(
|
||||||
success ? android.R.drawable.ic_dialog_info : android.R.drawable.ic_dialog_alert)
|
success ? android.R.drawable.ic_dialog_info : android.R.drawable.ic_dialog_alert)
|
||||||
.setMessage(message).setOnCancelListener(new DialogInterface.OnCancelListener() {
|
.setMessage(message).setOnCancelListener(new DialogInterface.OnCancelListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -155,22 +155,8 @@ public class SaveActivity extends Activity {
|
|||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}).setTitle(success ? R.string.generic_success_title : R.string.generic_error_title);
|
}).setTitle(success ? R.string.generic_success_title : R.string.generic_error_title)
|
||||||
|
.create();
|
||||||
if (success && trackId != -1L && !playTrack && savedPath != null) {
|
|
||||||
builder.setNegativeButton(
|
|
||||||
R.string.share_track_share_file, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
Intent intent = IntentUtils.newShareFileIntent(
|
|
||||||
SaveActivity.this, trackId, savedPath, trackFileFormat);
|
|
||||||
startActivity(
|
|
||||||
Intent.createChooser(intent, getString(R.string.share_track_picker_title)));
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return builder.create();
|
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -181,24 +167,31 @@ public class SaveActivity extends Activity {
|
|||||||
*
|
*
|
||||||
* @param aSuccessCount the number of tracks successfully saved
|
* @param aSuccessCount the number of tracks successfully saved
|
||||||
* @param aTotalCount the number of tracks to save
|
* @param aTotalCount the number of tracks to save
|
||||||
* @param aSavedPath the last successfully saved path
|
* @param savedPath the last successfully saved path
|
||||||
*/
|
*/
|
||||||
public void onAsyncTaskCompleted(int aSuccessCount, int aTotalCount, String aSavedPath) {
|
public void onAsyncTaskCompleted(int aSuccessCount, int aTotalCount, String savedPath) {
|
||||||
successCount = aSuccessCount;
|
successCount = aSuccessCount;
|
||||||
totalCount = aTotalCount;
|
totalCount = aTotalCount;
|
||||||
savedPath = aSavedPath;
|
|
||||||
removeDialog(DIALOG_PROGRESS_ID);
|
removeDialog(DIALOG_PROGRESS_ID);
|
||||||
if (successCount == 1 && totalCount == 1 && playTrack && savedPath != null) {
|
if (successCount == 1 && totalCount == 1 && savedPath != null) {
|
||||||
Intent intent = new Intent().addFlags(
|
if (playTrack) {
|
||||||
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
|
Intent intent = new Intent().addFlags(
|
||||||
.putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, KmlTrackWriter.TOUR_FEATURE_ID)
|
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
.setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS)
|
.putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, KmlTrackWriter.TOUR_FEATURE_ID)
|
||||||
.setDataAndType(Uri.fromFile(new File(savedPath)), GOOGLE_EARTH_KML_MIME_TYPE);
|
.setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS)
|
||||||
startActivity(intent);
|
.setDataAndType(Uri.fromFile(new File(savedPath)), GOOGLE_EARTH_KML_MIME_TYPE);
|
||||||
finish();
|
startActivity(intent);
|
||||||
} else {
|
finish();
|
||||||
showDialog(DIALOG_RESULT_ID);
|
return;
|
||||||
|
} else if (shareTrack) {
|
||||||
|
Intent intent = IntentUtils.newShareFileIntent(this, trackId, savedPath, trackFileFormat);
|
||||||
|
startActivity(
|
||||||
|
Intent.createChooser(intent, getString(R.string.share_track_picker_title)));
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
showDialog(DIALOG_RESULT_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+20
-4
@@ -28,6 +28,9 @@ import android.preference.ListPreference;
|
|||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity for accessing the sharing settings.
|
* An activity for accessing the sharing settings.
|
||||||
*
|
*
|
||||||
@@ -45,14 +48,27 @@ public class SharingSettingsActivity extends AbstractSettingsActivity {
|
|||||||
protected void onCreate(Bundle bundle) {
|
protected void onCreate(Bundle bundle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
addPreferencesFromResource(R.xml.sharing_settings);
|
addPreferencesFromResource(R.xml.sharing_settings);
|
||||||
|
|
||||||
shareTrackListPreference = (ListPreference) findPreference(getString(R.string.share_track_key));
|
shareTrackListPreference = (ListPreference) findPreference(getString(R.string.share_track_key));
|
||||||
String value = PreferencesUtils.getString(
|
String value = PreferencesUtils.getString(
|
||||||
this, R.string.share_track_key, PreferencesUtils.SHARE_TRACK_DEFAULT);
|
this, R.string.share_track_key, PreferencesUtils.SHARE_TRACK_DEFAULT);
|
||||||
String[] values = getResources().getStringArray(R.array.share_track_values);
|
|
||||||
String[] options = getResources().getStringArray(R.array.share_track_options);
|
String fileTypes[] = getResources().getStringArray(R.array.file_types);
|
||||||
|
ArrayList<String> shareTrackValues = new ArrayList<String>(
|
||||||
|
Arrays.asList(getResources().getStringArray(R.array.share_track_values)));
|
||||||
|
for (String fileType : fileTypes) {
|
||||||
|
shareTrackValues.add(fileType);
|
||||||
|
}
|
||||||
|
String[] values = shareTrackValues.toArray(new String[shareTrackValues.size()]);
|
||||||
|
|
||||||
|
ArrayList<String> shareTrackOptions = new ArrayList<String>(
|
||||||
|
Arrays.asList(getResources().getStringArray(R.array.share_track_options)));
|
||||||
|
for (String fileType : fileTypes) {
|
||||||
|
shareTrackOptions.add(getString(R.string.settings_sharing_share_track_file, fileType));
|
||||||
|
}
|
||||||
|
String[] options = shareTrackOptions.toArray(new String[shareTrackOptions.size()]);
|
||||||
|
|
||||||
configureListPreference(shareTrackListPreference, options, options, values, value, null);
|
configureListPreference(shareTrackListPreference, options, options, values, value, null);
|
||||||
|
|
||||||
|
|
||||||
allowAccessCheckBoxPreference = (CheckBoxPreference) findPreference(
|
allowAccessCheckBoxPreference = (CheckBoxPreference) findPreference(
|
||||||
getString(R.string.allow_access_key));
|
getString(R.string.allow_access_key));
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public class PreferencesUtils {
|
|||||||
|
|
||||||
public static final boolean CONFIRM_PLAY_EARTH_DEFAULT = true;
|
public static final boolean CONFIRM_PLAY_EARTH_DEFAULT = true;
|
||||||
public static final boolean CONFIRM_SHARE_DRIVE_DEFAULT = true;
|
public static final boolean CONFIRM_SHARE_DRIVE_DEFAULT = true;
|
||||||
|
public static final boolean CONFIRM_SHARE_FILE_DEFAULT = true;
|
||||||
public static final boolean CONFIRM_SHARE_MAPS_DEFAULT = true;
|
public static final boolean CONFIRM_SHARE_MAPS_DEFAULT = true;
|
||||||
|
|
||||||
public static final String DEFAULT_ACTIVITY_DEFAULT = "";
|
public static final String DEFAULT_ACTIVITY_DEFAULT = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user