use of android.content.ServiceConnection in project android_frameworks_base by AOSPA.
the class KeyChain method bindAsUser.
/**
* @hide
*/
@WorkerThread
public static KeyChainConnection bindAsUser(@NonNull Context context, UserHandle user) throws InterruptedException {
if (context == null) {
throw new NullPointerException("context == null");
}
ensureNotOnMainThread(context);
final BlockingQueue<IKeyChainService> q = new LinkedBlockingQueue<IKeyChainService>(1);
ServiceConnection keyChainServiceConnection = new ServiceConnection() {
volatile boolean mConnectedAtLeastOnce = false;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (!mConnectedAtLeastOnce) {
mConnectedAtLeastOnce = true;
try {
q.put(IKeyChainService.Stub.asInterface(service));
} catch (InterruptedException e) {
// will never happen, since the queue starts with one available slot
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(IKeyChainService.class.getName());
ComponentName comp = intent.resolveSystemService(context.getPackageManager(), 0);
intent.setComponent(comp);
if (comp == null || !context.bindServiceAsUser(intent, keyChainServiceConnection, Context.BIND_AUTO_CREATE, user)) {
throw new AssertionError("could not bind to KeyChainService");
}
return new KeyChainConnection(context, keyChainServiceConnection, q.take());
}
use of android.content.ServiceConnection in project android_frameworks_base by AOSPA.
the class AppWidgetServiceImpl method handleNotifyAppWidgetViewDataChanged.
private void handleNotifyAppWidgetViewDataChanged(Host host, IAppWidgetHost callbacks, int appWidgetId, int viewId, long requestId) {
try {
callbacks.viewDataChanged(appWidgetId, viewId);
host.lastWidgetUpdateRequestId = requestId;
} catch (RemoteException re) {
// It failed; remove the callback. No need to prune because
// we know that this host is still referenced by this instance.
callbacks = null;
}
// RemoteViewsFactory.onDataSetChanged() directly
synchronized (mLock) {
if (callbacks == null) {
host.callbacks = null;
Set<Pair<Integer, FilterComparison>> keys = mRemoteViewsServicesAppWidgets.keySet();
for (Pair<Integer, FilterComparison> key : keys) {
if (mRemoteViewsServicesAppWidgets.get(key).contains(appWidgetId)) {
final ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IRemoteViewsFactory cb = IRemoteViewsFactory.Stub.asInterface(service);
try {
cb.onDataSetChangedAsync();
} catch (RemoteException e) {
Slog.e(TAG, "Error calling onDataSetChangedAsync()", e);
}
mContext.unbindService(this);
}
@Override
public void onServiceDisconnected(android.content.ComponentName name) {
// Do nothing
}
};
final int userId = UserHandle.getUserId(key.first);
Intent intent = key.second.getIntent();
// Bind to the service and call onDataSetChanged()
bindService(intent, connection, new UserHandle(userId));
}
}
}
}
}
use of android.content.ServiceConnection in project android_frameworks_base by AOSPA.
the class AppWidgetServiceImpl method destroyRemoteViewsService.
// Destroys the cached factory on the RemoteViewsService's side related to the specified intent
private void destroyRemoteViewsService(final Intent intent, Widget widget) {
final ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
final IRemoteViewsFactory cb = IRemoteViewsFactory.Stub.asInterface(service);
try {
cb.onDestroy(intent);
} catch (RemoteException re) {
Slog.e(TAG, "Error calling remove view factory", re);
}
mContext.unbindService(this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// Do nothing
}
};
// Bind to the service and remove the static intent->factory mapping in the
// RemoteViewsService.
final long token = Binder.clearCallingIdentity();
try {
mContext.bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE, widget.provider.info.getProfile());
} finally {
Binder.restoreCallingIdentity(token);
}
}
use of android.content.ServiceConnection in project KISS by Neamar.
the class DataHandler method connectToProvider.
/**
* Require the data handler to be connected to the data provider with the given name
*
* @param name Data provider name (i.e.: `ContactsProvider` → `"contacts"`)
*/
protected void connectToProvider(final String name) {
// Do not continue if this provider has already been connected to
if (this.providers.containsKey(name)) {
return;
}
// Find provider class for the given service name
Intent intent = this.providerName2Intent(name);
if (intent == null) {
return;
}
// Send "start service" command first so that the service can run independently
// of the activity
this.context.startService(intent);
final ProviderEntry entry = new ProviderEntry();
// Connect and bind to provider service
this.context.bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
Provider.LocalBinder binder = (Provider.LocalBinder) service;
IProvider provider = binder.getService();
// Update provider info so that it contains something useful
entry.provider = provider;
entry.connection = this;
if (provider.isLoaded()) {
handleProviderLoaded();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
}, Context.BIND_AUTO_CREATE);
// Add empty provider object to list of providers
this.providers.put(name, entry);
}
use of android.content.ServiceConnection in project OneSignal-Android-SDK by OneSignal.
the class TrackGooglePurchase method trackIAP.
void trackIAP() {
if (mServiceConn == null) {
mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
iapEnabled = -99;
mIInAppBillingService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
Class<?> stubClass = Class.forName("com.android.vending.billing.IInAppBillingService$Stub");
Method asInterfaceMethod = getAsInterfaceMethod(stubClass);
asInterfaceMethod.setAccessible(true);
mIInAppBillingService = asInterfaceMethod.invoke(null, service);
QueryBoughtItems();
} catch (Throwable t) {
t.printStackTrace();
}
}
};
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
appContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
} else if (mIInAppBillingService != null)
QueryBoughtItems();
}
Aggregations