/* * Copyright (C) 2017 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 com.googlecode.android_scripting.facade; import android.app.Service; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.provider.CallLog.Calls; import android.util.Log; import com.googlecode.android_scripting.jsonrpc.RpcReceiver; import com.googlecode.android_scripting.rpc.Rpc; import com.googlecode.android_scripting.rpc.RpcParameter; import java.util.ArrayList; import java.util.List; import org.json.JSONException; import org.json.JSONObject; /** * Provides access to contacts related functionality. */ public class CallLogFacade extends RpcReceiver { private static final String TAG = "CallLogFacade"; private static final Uri CONTACTS_URI = Uri.parse("content://contacts/people"); // Fields for use in messages from SL4A scripts private static final String JSON_TYPE = "type"; private static final String JSON_NUMBER = "number"; private static final String JSON_TIME = "time"; private final ContentResolver mContentResolver; private final Service mService; private final CallLogStatusReceiver mCallLogStatusReceiver; private final EventFacade mEventFacade; public CallLogFacade(FacadeManager manager) { super(manager); mService = manager.getService(); mContentResolver = mService.getContentResolver(); mCallLogStatusReceiver = new CallLogStatusReceiver(); mContentResolver.registerContentObserver(Calls.CONTENT_URI, true, mCallLogStatusReceiver); mEventFacade = manager.getReceiver(EventFacade.class); } private Uri buildUri(Integer id) { Uri uri = ContentUris.withAppendedId(Calls.CONTENT_URI, id); return uri; } @Rpc(description = "Erase all contacts in phone book.") public void callLogsEraseAll() { Log.d(TAG, "callLogsEraseAll"); mContentResolver.delete(Calls.CONTENT_URI, null, null); return; } @Rpc(description = "Adds a list of calls to call log.", returns = "Number of calls added") public Integer callLogsPut(@RpcParameter(name = "logs") JSONObject log) throws JSONException { Log.d(TAG, "callLogsPut"); int startingCount = callLogGetCount(); ContentValues values = new ContentValues(); String type = log.getString(JSON_TYPE); String number = log.getString(JSON_NUMBER); String time = log.getString(JSON_TIME); values.put(Calls.TYPE, type); values.put(Calls.NUMBER, number); values.put(Calls.DATE, time); mContentResolver.insert(Calls.CONTENT_URI, values); return callLogGetCount() - startingCount; } @Rpc(description = "Returns a List of all contacts.", returns = "a List of contacts as Maps") public List callLogsGet(@RpcParameter(name = "type") String type) throws JSONException { Log.d(TAG, "callLogsGet"); List result = new ArrayList(); String[] query = new String[] {Calls.NUMBER, Calls.DATE, Calls.TYPE}; Cursor cursor = mContentResolver.query( Calls.CONTENT_URI, query, Calls.TYPE + "= " + type, null, Calls.DATE + ", " + Calls.NUMBER); if (cursor != null) { while (cursor.moveToNext()) { JSONObject message = new JSONObject(); for (int i = 0; i < query.length; i++) { String key = query[i]; String value = cursor.getString(cursor.getColumnIndex(key)); message.put(key, value); } result.add(message); } cursor.close(); } return result; } @Rpc(description = "Returns the number of contacts.") public Integer callLogGetCount() { Log.d(TAG, "callLogGetCount"); Integer result = 0; Cursor cursor = mContentResolver.query(Calls.CONTENT_URI, null, null, null, null); if (cursor != null) { result = cursor.getCount(); cursor.close(); } return result; } private class CallLogStatusReceiver extends ContentObserver { public CallLogStatusReceiver() { super(null); } public void onChange(boolean updated) { Log.d(TAG, "CallLogStatusReceiver:onChange"); mEventFacade.postEvent("CallLogChanged", null); } } @Override public void shutdown() { mContentResolver.unregisterContentObserver(mCallLogStatusReceiver); } }