Merge "Unhide new PackageManager APIs for API 14" into ics-factoryrom
This commit is contained in:
@ -759,6 +759,7 @@ package android {
|
|||||||
field public static final int prompt = 16843131; // 0x101017b
|
field public static final int prompt = 16843131; // 0x101017b
|
||||||
field public static final int propertyName = 16843489; // 0x10102e1
|
field public static final int propertyName = 16843489; // 0x10102e1
|
||||||
field public static final int protectionLevel = 16842761; // 0x1010009
|
field public static final int protectionLevel = 16842761; // 0x1010009
|
||||||
|
field public static final int publicKey = 16843686; // 0x10103a6
|
||||||
field public static final int queryActionMsg = 16843227; // 0x10101db
|
field public static final int queryActionMsg = 16843227; // 0x10101db
|
||||||
field public static final int queryAfterZeroResults = 16843394; // 0x1010282
|
field public static final int queryAfterZeroResults = 16843394; // 0x1010282
|
||||||
field public static final int queryHint = 16843608; // 0x1010358
|
field public static final int queryHint = 16843608; // 0x1010358
|
||||||
@ -5454,6 +5455,7 @@ package android.content {
|
|||||||
field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
|
field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
|
field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
|
||||||
field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
|
field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
|
||||||
|
field public static final java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
|
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
|
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
|
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
|
||||||
@ -6207,11 +6209,13 @@ package android.content.pm {
|
|||||||
method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
|
method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
|
||||||
method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
||||||
method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
|
method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
|
||||||
|
method public abstract void verifyPendingInstall(int, int);
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
|
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
|
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
|
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
|
||||||
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
|
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
|
||||||
field public static final int DONT_KILL_APP = 1; // 0x1
|
field public static final int DONT_KILL_APP = 1; // 0x1
|
||||||
|
field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
|
||||||
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
|
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
|
||||||
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
|
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
|
||||||
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
|
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
|
||||||
@ -6273,6 +6277,8 @@ package android.content.pm {
|
|||||||
field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
|
field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
|
||||||
field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
|
field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
|
||||||
field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
|
field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
|
||||||
|
field public static final int VERIFICATION_ALLOW = 1; // 0x1
|
||||||
|
field public static final int VERIFICATION_REJECT = -1; // 0xffffffff
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
|
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
|
||||||
@ -19834,6 +19840,7 @@ package android.test.mock {
|
|||||||
method public void setApplicationEnabledSetting(java.lang.String, int, int);
|
method public void setApplicationEnabledSetting(java.lang.String, int, int);
|
||||||
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
||||||
method public void setInstallerPackageName(java.lang.String, java.lang.String);
|
method public void setInstallerPackageName(java.lang.String, java.lang.String);
|
||||||
|
method public void verifyPendingInstall(int, int);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MockResources extends android.content.res.Resources {
|
public class MockResources extends android.content.res.Resources {
|
||||||
|
@ -759,6 +759,7 @@ package android {
|
|||||||
field public static final int prompt = 16843131; // 0x101017b
|
field public static final int prompt = 16843131; // 0x101017b
|
||||||
field public static final int propertyName = 16843489; // 0x10102e1
|
field public static final int propertyName = 16843489; // 0x10102e1
|
||||||
field public static final int protectionLevel = 16842761; // 0x1010009
|
field public static final int protectionLevel = 16842761; // 0x1010009
|
||||||
|
field public static final int publicKey = 16843686; // 0x10103a6
|
||||||
field public static final int queryActionMsg = 16843227; // 0x10101db
|
field public static final int queryActionMsg = 16843227; // 0x10101db
|
||||||
field public static final int queryAfterZeroResults = 16843394; // 0x1010282
|
field public static final int queryAfterZeroResults = 16843394; // 0x1010282
|
||||||
field public static final int queryHint = 16843608; // 0x1010358
|
field public static final int queryHint = 16843608; // 0x1010358
|
||||||
@ -5454,6 +5455,7 @@ package android.content {
|
|||||||
field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
|
field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
|
field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
|
||||||
field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
|
field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
|
||||||
|
field public static final java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
|
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
|
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
|
||||||
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
|
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
|
||||||
@ -6207,11 +6209,13 @@ package android.content.pm {
|
|||||||
method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
|
method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
|
||||||
method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
||||||
method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
|
method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
|
||||||
|
method public abstract void verifyPendingInstall(int, int);
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
|
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
|
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
|
||||||
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
|
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
|
||||||
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
|
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
|
||||||
field public static final int DONT_KILL_APP = 1; // 0x1
|
field public static final int DONT_KILL_APP = 1; // 0x1
|
||||||
|
field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
|
||||||
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
|
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
|
||||||
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
|
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
|
||||||
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
|
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
|
||||||
@ -6273,6 +6277,8 @@ package android.content.pm {
|
|||||||
field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
|
field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
|
||||||
field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
|
field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
|
||||||
field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
|
field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
|
||||||
|
field public static final int VERIFICATION_ALLOW = 1; // 0x1
|
||||||
|
field public static final int VERIFICATION_REJECT = -1; // 0xffffffff
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
|
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
|
||||||
@ -19834,6 +19840,7 @@ package android.test.mock {
|
|||||||
method public void setApplicationEnabledSetting(java.lang.String, int, int);
|
method public void setApplicationEnabledSetting(java.lang.String, int, int);
|
||||||
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
|
||||||
method public void setInstallerPackageName(java.lang.String, java.lang.String);
|
method public void setInstallerPackageName(java.lang.String, java.lang.String);
|
||||||
|
method public void verifyPendingInstall(int, int);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MockResources extends android.content.res.Resources {
|
public class MockResources extends android.content.res.Resources {
|
||||||
|
@ -954,9 +954,9 @@ final class ApplicationPackageManager extends PackageManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void verifyPendingInstall(int id, boolean verified, String failureMessage) {
|
public void verifyPendingInstall(int id, int response) {
|
||||||
try {
|
try {
|
||||||
mPM.verifyPendingInstall(id, verified, failureMessage);
|
mPM.verifyPendingInstall(id, response);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
// Should never happen!
|
// Should never happen!
|
||||||
}
|
}
|
||||||
|
@ -1535,8 +1535,6 @@ public class Intent implements Parcelable, Cloneable {
|
|||||||
* <p class="note">
|
* <p class="note">
|
||||||
* This is a protected intent that can only be sent by the system.
|
* This is a protected intent that can only be sent by the system.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
*/
|
||||||
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
|
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
|
||||||
public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
|
public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
|
||||||
|
@ -359,7 +359,7 @@ interface IPackageManager {
|
|||||||
int flags, in String installerPackageName, in Uri verificationURI,
|
int flags, in String installerPackageName, in Uri verificationURI,
|
||||||
in ManifestDigest manifestDigest);
|
in ManifestDigest manifestDigest);
|
||||||
|
|
||||||
void verifyPendingInstall(int id, boolean verified, in String message);
|
void verifyPendingInstall(int id, int verificationCode);
|
||||||
|
|
||||||
VerifierDeviceIdentity getVerifierDeviceIdentity();
|
VerifierDeviceIdentity getVerifierDeviceIdentity();
|
||||||
}
|
}
|
||||||
|
@ -724,8 +724,23 @@ public abstract class PackageManager {
|
|||||||
*/
|
*/
|
||||||
public static final int MOVE_EXTERNAL_MEDIA = 0x00000002;
|
public static final int MOVE_EXTERNAL_MEDIA = 0x00000002;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used as the {@code verificationCode} argument for
|
||||||
|
* {@link PackageManager#verifyPendingInstall} to indicate that the calling
|
||||||
|
* package verifier allows the installation to proceed.
|
||||||
|
*/
|
||||||
|
public static final int VERIFICATION_ALLOW = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used as the {@code verificationCode} argument for
|
||||||
|
* {@link PackageManager#verifyPendingInstall} to indicate the calling
|
||||||
|
* package verifier does not vote to allow the installation to proceed.
|
||||||
|
*/
|
||||||
|
public static final int VERIFICATION_REJECT = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Range of IDs allocated for a user.
|
* Range of IDs allocated for a user.
|
||||||
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int PER_USER_RANGE = 100000;
|
public static final int PER_USER_RANGE = 100000;
|
||||||
@ -1045,9 +1060,7 @@ public abstract class PackageManager {
|
|||||||
/**
|
/**
|
||||||
* Extra field name for the ID of a package pending verification. Passed to
|
* Extra field name for the ID of a package pending verification. Passed to
|
||||||
* a package verifier and is used to call back to
|
* a package verifier and is used to call back to
|
||||||
* {@link PackageManager#verifyPendingInstall(int, boolean)}
|
* {@link PackageManager#verifyPendingInstall(int, int)}
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
*/
|
||||||
public static final String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
|
public static final String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
|
||||||
|
|
||||||
@ -2156,16 +2169,17 @@ public abstract class PackageManager {
|
|||||||
/**
|
/**
|
||||||
* Allows a package listening to the
|
* Allows a package listening to the
|
||||||
* {@link Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification
|
* {@link Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification
|
||||||
* broadcast} to respond to the package manager.
|
* broadcast} to respond to the package manager. The response must include
|
||||||
|
* the {@code verificationCode} which is one of
|
||||||
|
* {@link PackageManager#VERIFICATION_ALLOW} or
|
||||||
|
* {@link PackageManager#VERIFICATION_REJECT}.
|
||||||
*
|
*
|
||||||
* @param id pending package identifier as passed via the
|
* @param id pending package identifier as passed via the
|
||||||
* {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra
|
* {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra
|
||||||
* @param verified whether the package was verified as valid
|
* @param verificationCode either {@link PackageManager#VERIFICATION_ALLOW}
|
||||||
* @param failureMessage if verification was false, this is the error
|
* or {@link PackageManager#VERIFICATION_REJECT}.
|
||||||
* message that may be shown to the user
|
|
||||||
* @hide
|
|
||||||
*/
|
*/
|
||||||
public abstract void verifyPendingInstall(int id, boolean verified, String failureMessage);
|
public abstract void verifyPendingInstall(int id, int verificationCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the installer associated with a given package. There are limitations
|
* Change the installer associated with a given package. There are limitations
|
||||||
|
@ -1562,6 +1562,19 @@
|
|||||||
</attr>
|
</attr>
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
|
<!-- The attribute that holds a Base64-encoded public key. -->
|
||||||
|
<attr name="publicKey" format="string" />
|
||||||
|
|
||||||
|
<!-- Attributes relating to a package verifier -->
|
||||||
|
<declare-styleable name="AndroidManifestPackageVerifier" parent="AndroidManifest">
|
||||||
|
<!-- Specifies the Java-style package name that defines this
|
||||||
|
package verifier. -->
|
||||||
|
<attr name="name" />
|
||||||
|
|
||||||
|
<!-- The Base64 encoded public key of the package verifier's
|
||||||
|
signature. -->
|
||||||
|
<attr name="publicKey" />
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
<!-- Declaration of an {@link android.content.Intent} object in XML. May
|
<!-- Declaration of an {@link android.content.Intent} object in XML. May
|
||||||
also include zero or more {@link #IntentCategory <category> and
|
also include zero or more {@link #IntentCategory <category> and
|
||||||
|
@ -1768,6 +1768,7 @@
|
|||||||
<public type="attr" name="listPreferredItemPaddingLeft" id="0x010103a3" />
|
<public type="attr" name="listPreferredItemPaddingLeft" id="0x010103a3" />
|
||||||
<public type="attr" name="listPreferredItemPaddingRight" id="0x010103a4" />
|
<public type="attr" name="listPreferredItemPaddingRight" id="0x010103a4" />
|
||||||
<public type="attr" name="requiresFadingEdge" id="0x010103a5" />
|
<public type="attr" name="requiresFadingEdge" id="0x010103a5" />
|
||||||
|
<public type="attr" name="publicKey" id="0x010103a6" />
|
||||||
|
|
||||||
<public type="style" name="TextAppearance.SuggestionHighlight" id="0x01030118" />
|
<public type="style" name="TextAppearance.SuggestionHighlight" id="0x01030118" />
|
||||||
<public type="style" name="Theme.Holo.Light.DarkActionBar" id="0x01030119" />
|
<public type="style" name="Theme.Holo.Light.DarkActionBar" id="0x01030119" />
|
||||||
|
@ -4849,15 +4849,14 @@ public class PackageManagerService extends IPackageManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void verifyPendingInstall(int id, boolean verified, String message)
|
public void verifyPendingInstall(int id, int verificationCode)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
mContext.enforceCallingOrSelfPermission(
|
mContext.enforceCallingOrSelfPermission(
|
||||||
android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, null);
|
android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, null);
|
||||||
|
|
||||||
final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED);
|
final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED);
|
||||||
msg.arg1 = id;
|
msg.arg1 = id;
|
||||||
msg.arg2 = verified ? 1 : 0;
|
msg.arg2 = verificationCode;
|
||||||
msg.obj = message;
|
|
||||||
mHandler.sendMessage(msg);
|
mHandler.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,11 +546,8 @@ public class MockPackageManager extends PackageManager {
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void verifyPendingInstall(int id, boolean verified, String failureMessage) {
|
public void verifyPendingInstall(int id, int verificationCode) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user