Merge "Extract TimeDetector/TimeZoneDetector interfaces" am: 17ac92f460 am: a9e81b53a9
Change-Id: I39134e3e45d3c6f2fac78a0180da7b83eb94b86f
This commit is contained in:
@@ -19,7 +19,7 @@ package android.app.timedetector {
|
|||||||
method @NonNull public android.app.timedetector.PhoneTimeSuggestion.Builder setUtcTime(@Nullable android.os.TimestampedValue<java.lang.Long>);
|
method @NonNull public android.app.timedetector.PhoneTimeSuggestion.Builder setUtcTime(@Nullable android.os.TimestampedValue<java.lang.Long>);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TimeDetector {
|
public interface TimeDetector {
|
||||||
method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTime(@NonNull android.app.timedetector.PhoneTimeSuggestion);
|
method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTime(@NonNull android.app.timedetector.PhoneTimeSuggestion);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ package android.app.timezonedetector {
|
|||||||
method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setZoneId(@Nullable String);
|
method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setZoneId(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TimeZoneDetector {
|
public interface TimeZoneDetector {
|
||||||
method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTimeZone(@NonNull android.app.timezonedetector.PhoneTimeZoneSuggestion);
|
method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTimeZone(@NonNull android.app.timezonedetector.PhoneTimeZoneSuggestion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,10 @@ import android.app.role.RoleControllerManager;
|
|||||||
import android.app.role.RoleManager;
|
import android.app.role.RoleManager;
|
||||||
import android.app.slice.SliceManager;
|
import android.app.slice.SliceManager;
|
||||||
import android.app.timedetector.TimeDetector;
|
import android.app.timedetector.TimeDetector;
|
||||||
|
import android.app.timedetector.TimeDetectorImpl;
|
||||||
import android.app.timezone.RulesManager;
|
import android.app.timezone.RulesManager;
|
||||||
import android.app.timezonedetector.TimeZoneDetector;
|
import android.app.timezonedetector.TimeZoneDetector;
|
||||||
|
import android.app.timezonedetector.TimeZoneDetectorImpl;
|
||||||
import android.app.trust.TrustManager;
|
import android.app.trust.TrustManager;
|
||||||
import android.app.usage.IStorageStatsManager;
|
import android.app.usage.IStorageStatsManager;
|
||||||
import android.app.usage.IUsageStatsManager;
|
import android.app.usage.IUsageStatsManager;
|
||||||
@@ -1288,7 +1290,7 @@ final class SystemServiceRegistry {
|
|||||||
@Override
|
@Override
|
||||||
public TimeDetector createService(ContextImpl ctx)
|
public TimeDetector createService(ContextImpl ctx)
|
||||||
throws ServiceNotFoundException {
|
throws ServiceNotFoundException {
|
||||||
return new TimeDetector();
|
return new TimeDetectorImpl();
|
||||||
}});
|
}});
|
||||||
|
|
||||||
registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class,
|
registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class,
|
||||||
@@ -1296,7 +1298,7 @@ final class SystemServiceRegistry {
|
|||||||
@Override
|
@Override
|
||||||
public TimeZoneDetector createService(ContextImpl ctx)
|
public TimeZoneDetector createService(ContextImpl ctx)
|
||||||
throws ServiceNotFoundException {
|
throws ServiceNotFoundException {
|
||||||
return new TimeZoneDetector();
|
return new TimeZoneDetectorImpl();
|
||||||
}});
|
}});
|
||||||
|
|
||||||
registerService(Context.TELEPHONY_IMS_SERVICE, android.telephony.ims.ImsManager.class,
|
registerService(Context.TELEPHONY_IMS_SERVICE, android.telephony.ims.ImsManager.class,
|
||||||
|
|||||||
@@ -21,73 +21,24 @@ import android.annotation.RequiresPermission;
|
|||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
import android.annotation.SystemService;
|
import android.annotation.SystemService;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.ServiceManager;
|
|
||||||
import android.os.ServiceManager.ServiceNotFoundException;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.TimestampedValue;
|
import android.os.TimestampedValue;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interface through which system components can send signals to the TimeDetectorService.
|
* The interface through which system components can send signals to the TimeDetectorService.
|
||||||
*
|
*
|
||||||
* <p>This class is marked non-final for mockito.
|
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
||||||
@SystemService(Context.TIME_DETECTOR_SERVICE)
|
@SystemService(Context.TIME_DETECTOR_SERVICE)
|
||||||
public class TimeDetector {
|
public interface TimeDetector {
|
||||||
private static final String TAG = "timedetector.TimeDetector";
|
|
||||||
private static final boolean DEBUG = false;
|
|
||||||
|
|
||||||
private final ITimeDetectorService mITimeDetectorService;
|
|
||||||
|
|
||||||
/** @hide */
|
|
||||||
public TimeDetector() throws ServiceNotFoundException {
|
|
||||||
mITimeDetectorService = ITimeDetectorService.Stub.asInterface(
|
|
||||||
ServiceManager.getServiceOrThrow(Context.TIME_DETECTOR_SERVICE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Suggests the current phone-signal derived time to the detector. The detector may ignore the
|
|
||||||
* signal if better signals are available such as those that come from more reliable sources or
|
|
||||||
* were determined more recently.
|
|
||||||
*/
|
|
||||||
@RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE)
|
|
||||||
public void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion) {
|
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "suggestPhoneTime called: " + timeSuggestion);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
mITimeDetectorService.suggestPhoneTime(timeSuggestion);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw e.rethrowFromSystemServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Suggests the user's manually entered current time to the detector.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
@RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE)
|
|
||||||
public void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion) {
|
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "suggestManualTime called: " + timeSuggestion);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
mITimeDetectorService.suggestManualTime(timeSuggestion);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw e.rethrowFromSystemServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A shared utility method to create a {@link ManualTimeSuggestion}.
|
* A shared utility method to create a {@link ManualTimeSuggestion}.
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static ManualTimeSuggestion createManualTimeSuggestion(long when, String why) {
|
static ManualTimeSuggestion createManualTimeSuggestion(long when, String why) {
|
||||||
TimestampedValue<Long> utcTime =
|
TimestampedValue<Long> utcTime =
|
||||||
new TimestampedValue<>(SystemClock.elapsedRealtime(), when);
|
new TimestampedValue<>(SystemClock.elapsedRealtime(), when);
|
||||||
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(utcTime);
|
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(utcTime);
|
||||||
@@ -95,20 +46,27 @@ public class TimeDetector {
|
|||||||
return manualTimeSuggestion;
|
return manualTimeSuggestion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suggests the current phone-signal derived time to the detector. The detector may ignore the
|
||||||
|
* signal if better signals are available such as those that come from more reliable sources or
|
||||||
|
* were determined more recently.
|
||||||
|
*/
|
||||||
|
@RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE)
|
||||||
|
void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suggests the user's manually entered current time to the detector.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE)
|
||||||
|
void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Suggests the time according to a network time source like NTP.
|
* Suggests the time according to a network time source like NTP.
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@RequiresPermission(android.Manifest.permission.SET_TIME)
|
@RequiresPermission(android.Manifest.permission.SET_TIME)
|
||||||
public void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion) {
|
void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion);
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "suggestNetworkTime called: " + timeSuggestion);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
mITimeDetectorService.suggestNetworkTime(timeSuggestion);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw e.rethrowFromSystemServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
77
core/java/android/app/timedetector/TimeDetectorImpl.java
Normal file
77
core/java/android/app/timedetector/TimeDetectorImpl.java
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.app.timedetector;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.os.ServiceManager.ServiceNotFoundException;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The real implementation of {@link TimeDetector}.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class TimeDetectorImpl implements TimeDetector {
|
||||||
|
private static final String TAG = "timedetector.TimeDetector";
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private final ITimeDetectorService mITimeDetectorService;
|
||||||
|
|
||||||
|
public TimeDetectorImpl() throws ServiceNotFoundException {
|
||||||
|
mITimeDetectorService = ITimeDetectorService.Stub.asInterface(
|
||||||
|
ServiceManager.getServiceOrThrow(Context.TIME_DETECTOR_SERVICE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "suggestPhoneTime called: " + timeSuggestion);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mITimeDetectorService.suggestPhoneTime(timeSuggestion);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "suggestManualTime called: " + timeSuggestion);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mITimeDetectorService.suggestManualTime(timeSuggestion);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "suggestNetworkTime called: " + timeSuggestion);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mITimeDetectorService.suggestNetworkTime(timeSuggestion);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,29 +21,25 @@ import android.annotation.RequiresPermission;
|
|||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
import android.annotation.SystemService;
|
import android.annotation.SystemService;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.ServiceManager;
|
|
||||||
import android.os.ServiceManager.ServiceNotFoundException;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interface through which system components can send signals to the TimeZoneDetectorService.
|
* The interface through which system components can send signals to the TimeZoneDetectorService.
|
||||||
*
|
*
|
||||||
* <p>This class is non-final for mockito.
|
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
||||||
@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
|
@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
|
||||||
public class TimeZoneDetector {
|
public interface TimeZoneDetector {
|
||||||
private static final String TAG = "timezonedetector.TimeZoneDetector";
|
|
||||||
private static final boolean DEBUG = false;
|
|
||||||
|
|
||||||
private final ITimeZoneDetectorService mITimeZoneDetectorService;
|
/**
|
||||||
|
* A shared utility method to create a {@link ManualTimeZoneSuggestion}.
|
||||||
/** @hide */
|
*
|
||||||
public TimeZoneDetector() throws ServiceNotFoundException {
|
* @hide
|
||||||
mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface(
|
*/
|
||||||
ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE));
|
static ManualTimeZoneSuggestion createManualTimeZoneSuggestion(String tzId, String debugInfo) {
|
||||||
|
ManualTimeZoneSuggestion suggestion = new ManualTimeZoneSuggestion(tzId);
|
||||||
|
suggestion.addDebugInfo(debugInfo);
|
||||||
|
return suggestion;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,16 +51,7 @@ public class TimeZoneDetector {
|
|||||||
*/
|
*/
|
||||||
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
|
||||||
@RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE)
|
@RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE)
|
||||||
public void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion) {
|
void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion);
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "suggestPhoneTimeZone called: " + timeZoneSuggestion);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
mITimeZoneDetectorService.suggestPhoneTimeZone(timeZoneSuggestion);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw e.rethrowFromSystemServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Suggests the current time zone, determined for the user's manually information, to the
|
* Suggests the current time zone, determined for the user's manually information, to the
|
||||||
@@ -73,25 +60,5 @@ public class TimeZoneDetector {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE)
|
@RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE)
|
||||||
public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) {
|
void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion);
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "suggestManualTimeZone called: " + timeZoneSuggestion);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
mITimeZoneDetectorService.suggestManualTimeZone(timeZoneSuggestion);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw e.rethrowFromSystemServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A shared utility method to create a {@link ManualTimeZoneSuggestion}.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public static ManualTimeZoneSuggestion createManualTimeZoneSuggestion(String tzId, String why) {
|
|
||||||
ManualTimeZoneSuggestion suggestion = new ManualTimeZoneSuggestion(tzId);
|
|
||||||
suggestion.addDebugInfo(why);
|
|
||||||
return suggestion;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.app.timezonedetector;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.os.ServiceManager.ServiceNotFoundException;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The real implementation of {@link TimeZoneDetector}.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class TimeZoneDetectorImpl implements TimeZoneDetector {
|
||||||
|
private static final String TAG = "timezonedetector.TimeZoneDetector";
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private final ITimeZoneDetectorService mITimeZoneDetectorService;
|
||||||
|
|
||||||
|
public TimeZoneDetectorImpl() throws ServiceNotFoundException {
|
||||||
|
mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface(
|
||||||
|
ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "suggestPhoneTimeZone called: " + timeZoneSuggestion);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mITimeZoneDetectorService.suggestPhoneTimeZone(timeZoneSuggestion);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "suggestManualTimeZone called: " + timeZoneSuggestion);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mITimeZoneDetectorService.suggestManualTimeZone(timeZoneSuggestion);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user