diff options
4 files changed, 231 insertions, 0 deletions
diff --git a/telephony/java/android/telephony/ClientRequestStats.aidl b/telephony/java/android/telephony/ClientRequestStats.aidl new file mode 100644 index 000000000000..206ee705614e --- /dev/null +++ b/telephony/java/android/telephony/ClientRequestStats.aidl @@ -0,0 +1,22 @@ +/* +** Copyright 2016, 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.telephony; + +/** + * @hide + */ +parcelable ClientRequestStats; diff --git a/telephony/java/android/telephony/ClientRequestStats.java b/telephony/java/android/telephony/ClientRequestStats.java new file mode 100644 index 000000000000..381c847d4db4 --- /dev/null +++ b/telephony/java/android/telephony/ClientRequestStats.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2016 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.telephony; + +import android.os.Parcel; +import android.os.Parcelable; +import android.telephony.TelephonyHistogram; +import android.util.SparseArray; +import java.util.ArrayList; +import java.util.List; + +/** + * Parcelable class to store Client request statistics information. + * + * @hide + */ +public final class ClientRequestStats implements Parcelable { + public static final Parcelable.Creator<ClientRequestStats> CREATOR = + new Parcelable.Creator<ClientRequestStats>() { + + public ClientRequestStats createFromParcel(Parcel in) { + return new ClientRequestStats(in); + } + + public ClientRequestStats[] newArray(int size) { + return new ClientRequestStats[size]; + } + }; + private static final int REQUEST_HISTOGRAM_BUCKET_COUNT = 5; + private String mCallingPackage; + /* completed requests wake lock time in milli seconds */ + private long mCompletedRequestsWakelockTime = 0; + private long mCompletedRequestsCount = 0; + private long mPendingRequestsWakelockTime = 0; + private long mPendingRequestsCount = 0; + private SparseArray<TelephonyHistogram> mRequestHistograms = + new SparseArray<TelephonyHistogram>(); + + public ClientRequestStats(Parcel in) { + readFromParcel(in); + } + + public ClientRequestStats() { + } + + public ClientRequestStats(ClientRequestStats clientRequestStats) { + mCallingPackage = clientRequestStats.getCallingPackage(); + mCompletedRequestsCount = clientRequestStats.getCompletedRequestsCount(); + mCompletedRequestsWakelockTime = clientRequestStats.getCompletedRequestsWakelockTime(); + mPendingRequestsCount = clientRequestStats.getPendingRequestsCount(); + mPendingRequestsWakelockTime = clientRequestStats.getPendingRequestsWakelockTime(); + + List<TelephonyHistogram> list = clientRequestStats.getRequestHistograms(); + for (TelephonyHistogram entry : list) { + mRequestHistograms.put(entry.getId(), entry); + } + } + + public String getCallingPackage() { + return mCallingPackage; + } + + public void setCallingPackage(String mCallingPackage) { + this.mCallingPackage = mCallingPackage; + } + + public long getCompletedRequestsWakelockTime() { + return mCompletedRequestsWakelockTime; + } + + public void addCompletedWakelockTime(long completedRequestsWakelockTime) { + this.mCompletedRequestsWakelockTime += completedRequestsWakelockTime; + } + + public long getPendingRequestsWakelockTime() { + return mPendingRequestsWakelockTime; + } + + public void setPendingRequestsWakelockTime(long pendingRequestsWakelockTime) { + this.mPendingRequestsWakelockTime = pendingRequestsWakelockTime; + } + + public long getCompletedRequestsCount() { + return mCompletedRequestsCount; + } + + public void incrementCompletedRequestsCount() { + this.mCompletedRequestsCount++; + } + + public long getPendingRequestsCount() { + return mPendingRequestsCount; + } + + public void setPendingRequestsCount(long pendingRequestsCount) { + this.mPendingRequestsCount = pendingRequestsCount; + } + + public List<TelephonyHistogram> getRequestHistograms() { + List<TelephonyHistogram> list; + synchronized (mRequestHistograms) { + list = new ArrayList<>(mRequestHistograms.size()); + for (int i = 0; i < mRequestHistograms.size(); i++) { + TelephonyHistogram entry = new TelephonyHistogram(mRequestHistograms.valueAt(i)); + list.add(entry); + } + } + return list; + } + + public void updateRequestHistograms(int requestId, int time) { + synchronized (mRequestHistograms) { + TelephonyHistogram entry = mRequestHistograms.get(requestId); + if (entry == null) { + entry = new TelephonyHistogram(TelephonyHistogram.TELEPHONY_CATEGORY_RIL, + requestId, REQUEST_HISTOGRAM_BUCKET_COUNT); + mRequestHistograms.put(requestId, entry); + } + entry.addTimeTaken(time); + } + } + + @Override + public String toString() { + return "ClientRequestStats{" + + "mCallingPackage='" + mCallingPackage + '\'' + + ", mCompletedRequestsWakelockTime=" + mCompletedRequestsWakelockTime + + ", mCompletedRequestsCount=" + mCompletedRequestsCount + + ", mPendingRequestsWakelockTime=" + mPendingRequestsWakelockTime + + ", mPendingRequestsCount=" + mPendingRequestsCount + + '}'; + } + + @Override + public int describeContents() { + return 0; + } + + public void readFromParcel(Parcel in) { + mCallingPackage = in.readString(); + mCompletedRequestsWakelockTime = in.readLong(); + mCompletedRequestsCount = in.readLong(); + mPendingRequestsWakelockTime = in.readLong(); + mPendingRequestsCount = in.readLong(); + ArrayList<TelephonyHistogram> requestHistograms = new ArrayList<TelephonyHistogram>(); + in.readTypedList(requestHistograms, TelephonyHistogram.CREATOR); + for (TelephonyHistogram h : requestHistograms) { + mRequestHistograms.put(h.getId(), h); + } + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mCallingPackage); + dest.writeLong(mCompletedRequestsWakelockTime); + dest.writeLong(mCompletedRequestsCount); + dest.writeLong(mPendingRequestsWakelockTime); + dest.writeLong(mPendingRequestsCount); + dest.writeTypedList(getRequestHistograms()); + } +} diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1554868c30f2..fcae4c30ea70 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -39,6 +39,7 @@ import android.os.SystemProperties; import android.service.carrier.CarrierIdentifier; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; +import android.telephony.ClientRequestStats; import android.telephony.TelephonyHistogram; import android.telephony.ims.feature.ImsFeature; import android.util.Log; @@ -5844,5 +5845,27 @@ public class TelephonyManager { Log.e(TAG, "Error calling ITelephony#setPolicyDataEnabled", e); } } + + /** + * Get Client request stats which will contain statistical information + * on each request made by client. + * Callers require either READ_PRIVILEGED_PHONE_STATE or + * READ_PHONE_STATE to retrieve the information. + * @param subId sub id + * @return List of Client Request Stats + * @hide + */ + public List<ClientRequestStats> getClientRequestStats(int subId) { + try { + ITelephony service = getITelephony(); + if (service != null) { + return service.getClientRequestStats(getOpPackageName(), subId); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#getClientRequestStats", e); + } + + return null; + } } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index d406cb07fc45..19885966084c 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -24,6 +24,7 @@ import android.service.carrier.CarrierIdentifier; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telephony.CellInfo; +import android.telephony.ClientRequestStats; import android.telephony.IccOpenLogicalChannelResponse; import android.telephony.ModemActivityInfo; import android.telephony.NeighboringCellInfo; @@ -1192,4 +1193,14 @@ interface ITelephony { * @hide */ void setPolicyDataEnabled(boolean enabled, int subId); + + + /** + * Get Client request stats which will contain statistical information + * on each request made by client. + * @param callingPackage package making the call. + * @param subId Subscription index + * @hide + */ + List<ClientRequestStats> getClientRequestStats(String callingPackage, int subid); } |