PageRenderTime 28ms CodeModel.GetById 14ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 0ms

/services/java/com/android/server/am/IntentBindRecord.java

https://github.com/aizuzi/platform_frameworks_base
Java | 112 lines | 76 code | 10 blank | 26 comment | 10 complexity | dc2984f81548a0d68354f4a5c37f2268 MD5 | raw file
  1/*
  2 * Copyright (C) 2006 The Android Open Source Project
  3 *
  4 * Licensed under the Apache License, Version 2.0 (the "License");
  5 * you may not use this file except in compliance with the License.
  6 * You may obtain a copy of the License at
  7 *
  8 *      http://www.apache.org/licenses/LICENSE-2.0
  9 *
 10 * Unless required by applicable law or agreed to in writing, software
 11 * distributed under the License is distributed on an "AS IS" BASIS,
 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 * See the License for the specific language governing permissions and
 14 * limitations under the License.
 15 */
 16
 17package com.android.server.am;
 18
 19import android.content.Context;
 20import android.content.Intent;
 21import android.os.IBinder;
 22import android.util.ArrayMap;
 23
 24import java.io.PrintWriter;
 25import java.util.HashMap;
 26import java.util.Iterator;
 27
 28/**
 29 * A particular Intent that has been bound to a Service.
 30 */
 31final class IntentBindRecord {
 32    /** The running service. */
 33    final ServiceRecord service;
 34    /** The intent that is bound.*/
 35    final Intent.FilterComparison intent; // 
 36    /** All apps that have bound to this Intent. */
 37    final ArrayMap<ProcessRecord, AppBindRecord> apps
 38            = new ArrayMap<ProcessRecord, AppBindRecord>();
 39    /** Binder published from service. */
 40    IBinder binder;
 41    /** Set when we have initiated a request for this binder. */
 42    boolean requested;
 43    /** Set when we have received the requested binder. */
 44    boolean received;
 45    /** Set when we still need to tell the service all clients are unbound. */
 46    boolean hasBound;
 47    /** Set when the service's onUnbind() has asked to be told about new clients. */
 48    boolean doRebind;
 49    
 50    String stringName;      // caching of toString
 51    
 52    void dump(PrintWriter pw, String prefix) {
 53        pw.print(prefix); pw.print("service="); pw.println(service);
 54        dumpInService(pw, prefix);
 55    }
 56
 57    void dumpInService(PrintWriter pw, String prefix) {
 58        pw.print(prefix); pw.print("intent={");
 59                pw.print(intent.getIntent().toShortString(false, true, false, false));
 60                pw.println('}');
 61        pw.print(prefix); pw.print("binder="); pw.println(binder);
 62        pw.print(prefix); pw.print("requested="); pw.print(requested);
 63                pw.print(" received="); pw.print(received);
 64                pw.print(" hasBound="); pw.print(hasBound);
 65                pw.print(" doRebind="); pw.println(doRebind);
 66        for (int i=0; i<apps.size(); i++) {
 67            AppBindRecord a = apps.valueAt(i);
 68            pw.print(prefix); pw.print("* Client AppBindRecord{");
 69                    pw.print(Integer.toHexString(System.identityHashCode(a)));
 70                    pw.print(' '); pw.print(a.client); pw.println('}');
 71            a.dumpInIntentBind(pw, prefix + "  ");
 72        }
 73    }
 74
 75    IntentBindRecord(ServiceRecord _service, Intent.FilterComparison _intent) {
 76        service = _service;
 77        intent = _intent;
 78    }
 79
 80    int collectFlags() {
 81        int flags = 0;
 82        for (int i=apps.size()-1; i>=0; i--) {
 83            AppBindRecord app = apps.valueAt(i);
 84            if (app.connections.size() > 0) {
 85                for (ConnectionRecord conn : app.connections) {
 86                    flags |= conn.flags;
 87                }
 88            }
 89        }
 90        return flags;
 91    }
 92
 93    public String toString() {
 94        if (stringName != null) {
 95            return stringName;
 96        }
 97        StringBuilder sb = new StringBuilder(128);
 98        sb.append("IntentBindRecord{");
 99        sb.append(Integer.toHexString(System.identityHashCode(this)));
100        sb.append(' ');
101        if ((collectFlags()&Context.BIND_AUTO_CREATE) != 0) {
102            sb.append("CR ");
103        }
104        sb.append(service.shortName);
105        sb.append(':');
106        if (intent != null) {
107            intent.getIntent().toShortString(sb, false, false, false, false);
108        }
109        sb.append('}');
110        return stringName = sb.toString();
111    }
112}