eleith
/
calchoochoo
Archived
1
0
Fork 0

decouple activities that don't need google api client, give devicelocation its own google api client, preserve location across activity jumps, add misc folder for varios assets used in app promotion

This commit is contained in:
eleith 2017-04-23 17:54:56 -07:00
parent c8e91cc9ef
commit b06d80c9da
14 changed files with 294 additions and 94 deletions

View File

@ -18,7 +18,7 @@ import com.eleith.calchoochoo.utils.RxBusMessage.RxMessageKeys;
import com.eleith.calchoochoo.utils.RxBusMessage.RxMessageLocation;
import com.eleith.calchoochoo.utils.RxBusMessage.RxMessageStops;
import com.eleith.calchoochoo.utils.StopUtils;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.maps.model.LatLng;
import org.parceler.Parcels;
@ -37,12 +37,11 @@ public class MapSearchActivity extends AppCompatActivity {
private ArrayList<Stop> stops;
private Location location;
private ChooChooDrawer chooChooDrawer;
private LatLng myDefaultLatLng = new LatLng(37.3860517, -122.0838511);
@Inject
RxBus rxBus;
@Inject
GoogleApiClient googleApiClient;
@Inject
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@ -71,16 +70,13 @@ public class MapSearchActivity extends AppCompatActivity {
if (stops == null) {
chooChooLoader.loadParentStops();
}
deviceLocation.requestLocationUpdates();
deviceLocation.requestLocation();
deviceLocation.listenForLocationUpdates();
}
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
if (subscription.isUnsubscribed()) {
subscription = rxBus.observeEvents(RxMessage.class).subscribe(handleRxMessages());
}
@ -88,14 +84,15 @@ public class MapSearchActivity extends AppCompatActivity {
if (subscriptionLocation.isUnsubscribed()) {
subscriptionLocation = rxBus.observeEvents(RxMessageLocation.class).take(1).subscribe(handleRxLocationMessages());
}
deviceLocation.listenForLocationUpdates();
}
@Override
protected void onStop() {
super.onStop();
googleApiClient.disconnect();
subscription.unsubscribe();
subscriptionLocation.unsubscribe();
deviceLocation.stopListeningForLocationUpdates();
}
@Override
@ -106,7 +103,6 @@ public class MapSearchActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
googleApiClient.reconnect();
}
@Override
@ -172,6 +168,11 @@ public class MapSearchActivity extends AppCompatActivity {
@Override
public void call(RxMessageLocation rxMessage) {
location = rxMessage.getMessage();
if (location == null) {
location = new Location("default");
location.setLongitude(myDefaultLatLng.longitude);
location.setLatitude(myDefaultLatLng.latitude);
}
initializeFragments();
}
};

View File

@ -42,8 +42,6 @@ public class StopActivity extends AppCompatActivity {
@Inject
RxBus rxBus;
@Inject
GoogleApiClient googleApiClient;
@Inject
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@ -80,7 +78,6 @@ public class StopActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
if (subscription.isUnsubscribed()) {
subscription = rxBus.observeEvents(RxMessage.class).subscribe(new HandleRxMessages());
}
@ -89,7 +86,6 @@ public class StopActivity extends AppCompatActivity {
@Override
protected void onStop() {
super.onStop();
googleApiClient.disconnect();
subscription.unsubscribe();
}
@ -101,7 +97,6 @@ public class StopActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
googleApiClient.reconnect();
}
@Override

View File

@ -39,8 +39,6 @@ public class StopSearchActivity extends AppCompatActivity {
@Inject
RxBus rxBus;
@Inject
GoogleApiClient googleApiClient;
@Inject
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@ -66,13 +64,11 @@ public class StopSearchActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
googleApiClient.disconnect();
subscription.unsubscribe();
subscriptionLocation.unsubscribe();
KeyboardUtils.hide(this);
@ -86,7 +82,6 @@ public class StopSearchActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
googleApiClient.reconnect();
}
@Override

View File

@ -61,8 +61,6 @@ public class TripActivity extends AppCompatActivity {
@Inject
RxBus rxBus;
@Inject
GoogleApiClient googleApiClient;
@Inject
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@ -151,7 +149,6 @@ public class TripActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
if (subscription.isUnsubscribed()) {
subscription = rxBus.observeEvents(RxMessage.class).subscribe(new HandleRxMessages());
}
@ -160,7 +157,6 @@ public class TripActivity extends AppCompatActivity {
@Override
protected void onStop() {
super.onStop();
googleApiClient.disconnect();
subscription.unsubscribe();
}
@ -172,7 +168,6 @@ public class TripActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
googleApiClient.reconnect();
}
@Override

View File

@ -47,8 +47,6 @@ public class TripFilterActivity extends AppCompatActivity {
@Inject
RxBus rxBus;
@Inject
GoogleApiClient googleApiClient;
@Inject
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@ -99,14 +97,12 @@ public class TripFilterActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
subscription = rxBus.observeEvents(RxMessage.class).subscribe(handleRxMessage());
}
@Override
protected void onStop() {
super.onStop();
googleApiClient.disconnect();
fabShow();
if (subscriptionTrips != null) {
subscriptionTrips.unsubscribe();
@ -122,7 +118,6 @@ public class TripFilterActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
googleApiClient.reconnect();
}
@Override

View File

@ -31,12 +31,4 @@ public class AppModule {
public Context provideApplicationContext() {
return application;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApiClient(Context context) {
return new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.build();
}
}

View File

@ -68,7 +68,7 @@ public class ChooChooModule {
@ChooChooScope
@Provides
DeviceLocation providesDeviceLocation(RxBus rxBus, GoogleApiClient googleApiClient) {
return new DeviceLocation(rxBus, googleApiClient, activity);
DeviceLocation providesDeviceLocation(RxBus rxBus) {
return new DeviceLocation(rxBus, activity);
}
}

View File

@ -31,7 +31,7 @@ public class ChooChooWidgetConfigureModule {
@ChooChooWidgetConfigureScope
@Provides
DeviceLocation providesDeviceLocation(RxBus rxBus, GoogleApiClient googleApiClient) {
return new DeviceLocation(rxBus, googleApiClient, chooChooWidgetConfigure);
DeviceLocation providesDeviceLocation(RxBus rxBus) {
return new DeviceLocation(rxBus, chooChooWidgetConfigure);
}
}

View File

@ -16,7 +16,6 @@ import com.eleith.calchoochoo.R;
import com.eleith.calchoochoo.data.ChooChooLoader;
import com.eleith.calchoochoo.data.Stop;
import com.eleith.calchoochoo.utils.BundleKeys;
import com.eleith.calchoochoo.utils.DeviceLocation;
import com.eleith.calchoochoo.utils.DrawableUtils;
import com.eleith.calchoochoo.utils.MapUtils;
import com.eleith.calchoochoo.utils.RxBus;
@ -54,7 +53,6 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
private ArrayList<Stop> stops = null;
private Location lastLocation;
private Marker locationMarker;
private LatLng myDefaultLatLng = new LatLng(37.04, -121.6);
private Subscription subscriptionRxBus;
@Inject
@ -63,8 +61,6 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
ChooChooRouterManager chooChooRouterManager;
@Inject
ChooChooLoader chooChooLoader;
@Inject
DeviceLocation deviceLocation;
@BindView(R.id.map_search_input)
EditText mapSearchInput;
@ -132,12 +128,6 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
MapUtils.moveMapToLocation(lastLocation, googleMap, new CameraPosition.Builder().zoom(13));
setMyLocationMarker(lastLocation);
} else {
myLatLng = myDefaultLatLng;
cameraBuilder.target(myLatLng);
CameraPosition cameraPosition = cameraBuilder.build();
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
googleMap.setOnMarkerClickListener(new OnMarkerClickListener());
}
subscriptionRxBus = rxBus.observeEvents(RxMessage.class).subscribe(handleRxMessages());
@ -200,6 +190,9 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
@Override
public void onStart() {
super.onStart();
if (subscriptionRxBus != null && subscriptionRxBus.isUnsubscribed()) {
subscriptionRxBus = rxBus.observeEvents(RxMessage.class).subscribe(handleRxMessages());
}
}
@Override
@ -224,6 +217,10 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
@Override
public void onSaveInstanceState(Bundle outState) {
googleMapView.onSaveInstanceState(outState);
outState.putParcelable(BundleKeys.STOPS, Parcels.wrap(stops));
outState.putParcelable(BundleKeys.LOCATION, lastLocation);
super.onSaveInstanceState(outState);
}
@ -250,9 +247,11 @@ public class MapSearchFragment extends Fragment implements OnMapReadyCallback {
LatLng myLatLng = new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder().zoom(13).target(myLatLng).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
} else if (rxMessage.isMessageValidFor(RxMessageKeys.MY_LOCATION_UPDATE)) {
} else if (rxMessage.isMessageValidFor(RxMessageKeys.MY_LOCATION_UPDATE) || rxMessage.isMessageValidFor(RxMessageKeys.MY_LOCATION)) {
Location location = ((RxMessageLocation) rxMessage).getMessage();
setMyLocationMarker(location);
if (location != null) {
setMyLocationMarker(location);
}
}
}
};

View File

@ -15,7 +15,6 @@ import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;
import javax.inject.Inject;
@ -28,56 +27,46 @@ public class DeviceLocation
private RxBus rxBus;
private GoogleApiClient googleApiClient;
private Activity activity;
private Boolean googleApiClientReady = false;
private int requestedUpdates = 0;
private int requestedLocation = 0;
private Boolean requestingUpdates = false;
private LatLng myDefaultLatLng = new LatLng(37.04, -121.6);
@Inject
public DeviceLocation(RxBus rxBus, GoogleApiClient googleApiClient, Activity activity) {
public DeviceLocation(RxBus rxBus, Activity activity) {
this.rxBus = rxBus;
this.googleApiClient = googleApiClient;
this.activity = activity;
googleApiClient = new GoogleApiClient.Builder(activity).addApi(LocationServices.API).build();
googleApiClient.registerConnectionFailedListener(this);
googleApiClient.registerConnectionCallbacks(this);
}
private void connectGoogleApiClient() {
if (!googleApiClient.isConnected() && !googleApiClient.isConnecting()) {
googleApiClient.connect();
}
}
public void requestLocation() {
if (googleApiClientReady) {
if (googleApiClient.isConnected()) {
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (activity.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
onLocationChanged(location);
} else {
location = new Location("default");
location.setLatitude(myDefaultLatLng.latitude);
location.setLongitude(myDefaultLatLng.longitude);
onLocationChanged(location);
}
return;
sendLastLocation(location);
} else {
activity.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Permissions.READ_GPS);
}
} else {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
sendLastLocation(location);
}
} else {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
onLocationChanged(location);
} else {
location = new Location("default");
location.setLatitude(myDefaultLatLng.latitude);
location.setLongitude(myDefaultLatLng.longitude);
onLocationChanged(location);
}
return;
requestedLocation++;
connectGoogleApiClient();
}
requestedLocation++;
}
public void requestLocationUpdates() {
if (googleApiClientReady) {
public void listenForLocationUpdates() {
if (googleApiClient.isConnected()) {
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (activity.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
if (!requestingUpdates) {
@ -88,7 +77,6 @@ public class DeviceLocation
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
requestingUpdates = true;
}
return;
} else {
activity.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Permissions.READ_GPS);
}
@ -101,19 +89,22 @@ public class DeviceLocation
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
requestingUpdates = true;
}
return;
}
} else {
requestedUpdates++;
connectGoogleApiClient();
}
requestedUpdates++;
}
public void stopListeningForLocationUpdates() {
requestingUpdates = false;
googleApiClient.disconnect();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
googleApiClientReady = true;
requestingUpdates = false;
if (requestedUpdates > 0) {
requestLocationUpdates();
listenForLocationUpdates();
}
if (requestedLocation > 0) {
@ -123,19 +114,23 @@ public class DeviceLocation
@Override
public void onConnectionSuspended(int i) {
googleApiClientReady = false;
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
googleApiClientReady = false;
}
@Override
public void onLocationChanged(Location location) {
if (location != null) {
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION_UPDATE, location));
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION_UPDATE, location));
}
private void sendLastLocation(Location location) {
requestedLocation--;
if (requestedUpdates == 0 && !requestingUpdates && requestedLocation == 0) {
googleApiClient.disconnect();
}
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION, location));
}
@Override
@ -144,7 +139,7 @@ public class DeviceLocation
case Permissions.READ_GPS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestedUpdates > 0) {
requestLocationUpdates();
listenForLocationUpdates();
} else if (requestedLocation > 0) {
requestLocation();
}
@ -154,5 +149,4 @@ public class DeviceLocation
}
}
}
}

BIN
misc/CT-GTFS-updated.zip Normal file

Binary file not shown.

135
misc/calchoochoo.svg Normal file
View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="レイヤー_1"
x="0px"
y="0px"
width="128px"
height="128px"
viewBox="0 0 128 128"
enable-background="new 0 0 128 128"
xml:space="preserve"><metadata
id="metadata4319"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4317"><filter
style="color-interpolation-filters:sRGB"
id="filter4730-3"><feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood4732-6" /><feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite4734-7" /><feGaussianBlur
in="composite1"
stdDeviation="0.5"
result="blur"
id="feGaussianBlur4736-5" /><feOffset
dx="0.5"
dy="0.5"
result="offset"
id="feOffset4738-3" /><feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite4740-5" /></filter></defs><path
style="fill:#ffc107;fill-opacity:1;filter:url(#filter4730-3)"
d="M 128.07891,63.710147 A 63.924564,63.924564 0 0 1 64.154345,127.63472 63.924564,63.924564 0 0 1 0.22978089,63.710147 63.924564,63.924564 0 0 1 64.154345,-0.21441708 63.924564,63.924564 0 0 1 128.07891,63.710147 Z"
id="path4321" /><g
id="g4247"
transform="matrix(0.80543844,0,0,0.83319532,13.416159,3.149781)"
clip-path="none"><path
d="m 64.35,72.12 c -3.31,0 -5.99,-2.23 -5.99,-4.98 l 0,-13.92 c 0,-2.74 2.68,-4.97 5.99,-4.97 3.3,0 5.99,2.22 5.99,4.97 l 0,13.92 c 0.01,2.74 -2.68,4.98 -5.99,4.98 z"
id="path4249"
style="fill:#ed6c30" /><path
d="m 49.29,75.75 c -3.31,0 -5.98,-2.23 -5.98,-4.97 l 0,-13.91 c 0,-2.75 2.67,-4.98 5.98,-4.98 3.31,0 6,2.22 6,4.98 l 0,13.92 c -0.01,2.73 -2.7,4.96 -6,4.96 z"
id="path4251"
style="fill:#ed6c30" /><path
style="fill:#2f2f2f"
d="m 26.440001,95.779999 95.409999,0 0,15.910001 -95.409999,0 z"
id="rect4253" /><path
style="fill:#ed6c30"
d="m 13.36,63.23 91.81,0 0,37.41 -91.81,0 z"
id="rect4255" /><path
style="fill:#ed6c30"
d="m 77.940002,39.580002 43.919998,0 0,61.059998 -43.919998,0 z"
id="rect4257" /><g
id="g4259"><path
d="m 35.04,63.24 c 4.26,0 7.72,8.38 7.72,18.71 0,10.33 -3.46,18.7 -7.72,18.7 -4.27,0 -7.73,-8.37 -7.73,-18.7 0.01,-10.33 3.47,-18.71 7.73,-18.71 z"
id="path4261"
style="fill:#2f2f2f" /><path
d="m 35.04,101.69 c -4.92,0 -8.77,-8.67 -8.77,-19.74 0,-11.07 3.85,-19.74 8.77,-19.74 4.91,0 8.76,8.67 8.76,19.74 0,11.07 -3.85,19.74 -8.76,19.74 z m 0,-37.41 c -3.16,0 -6.69,7.26 -6.69,17.67 0,10.41 3.53,17.66 6.69,17.66 3.16,0 6.68,-7.25 6.68,-17.66 0,-10.41 -3.52,-17.67 -6.68,-17.67 z"
id="path4263"
style="fill:#fcc21b" /></g><path
style="fill:#2f2f2f"
d="m 13.79,63.209999 21.780001,0 0,37.930001 -21.780001,0 z"
id="rect4265" /><path
clip-path="none"
style="fill:#2f2f2f"
d="m 71.959999,32.66 55.890001,0 0,6.93 -55.890001,0 z"
id="rect4267" /><path
style="fill:#2f2f2f"
d="m 44.49,33.93 -9.05,29.3 -14.52,0 -9.05,-29.3 z"
id="polygon4269" /><path
style="fill:#2f2f2f"
d="m 44.49,33.93 -4.65,-10.37 -23.53,0 -4.44,10.37 z"
id="polygon4271" /><path
style="fill:#2f2f2f"
d="m 13.36,100.64 -13.21,19.55 28.52,0 0,-19.55 z"
id="polygon4273" /><path
d="m 116.51,45.55 c 0,-1.54 -1.25,-2.8 -2.81,-2.8 l -12.51,0 c -1.56,0 -2.83,1.26 -2.83,2.8 l 0,21.64 c 0,1.55 1.27,2.8 2.83,2.8 l 12.51,0 c 1.56,0 2.81,-1.24 2.81,-2.8 l 0,-21.64 z"
id="path4275"
style="fill:#ffffff" /><path
style="fill:#2f2f2f"
d="m 0.15000001,114.26 28.51999999,0 0,5.93 -28.51999999,0 z"
id="rect4277" /><g
id="g4279"><path
d="m 82.79,105.02 c 0,8.53 -6.91,15.44 -15.42,15.44 -8.53,0 -15.45,-6.91 -15.45,-15.44 0,-8.53 6.92,-15.44 15.45,-15.44 8.52,0 15.42,6.91 15.42,15.44 z"
id="path4281"
style="fill:#78a3ad" /></g><g
id="g4283"><path
d="m 76.25,105.02 c 0,4.91 -3.98,8.9 -8.89,8.9 -4.92,0 -8.91,-3.98 -8.91,-8.9 0,-4.92 3.99,-8.89 8.91,-8.89 4.91,0 8.89,3.98 8.89,8.89 z"
id="path4285"
style="fill:#2f2f2f" /></g><g
id="g4287"><path
d="m 113.68,105.02 c 0,8.53 -6.91,15.44 -15.43,15.44 -8.53,0 -15.45,-6.91 -15.45,-15.44 0,-8.53 6.92,-15.44 15.45,-15.44 8.52,0 15.43,6.91 15.43,15.44 z"
id="path4289"
style="fill:#78a3ad" /></g><g
id="g4291"><path
d="m 107.13,105.02 c 0,4.91 -3.98,8.9 -8.9,8.9 -4.91,0 -8.9,-3.98 -8.9,-8.9 0,-4.92 3.99,-8.89 8.9,-8.89 4.92,0 8.9,3.98 8.9,8.89 z"
id="path4293"
style="fill:#2f2f2f" /></g><path
d="m 70.04,104.25 c -1.42,0 -2.58,-1.16 -2.58,-2.59 l 0,0 c 0,-1.42 1.16,-2.58 2.58,-2.58 l 25.54,0 c 1.42,0 2.57,1.15 2.57,2.58 l 0,0 c 0,1.43 -1.15,2.59 -2.57,2.59 l -25.54,0 z"
id="path4295"
style="fill:#ffffff" /><g
id="g4297"><g
id="g4299"><path
d="m 50.47,109.57 c 0,6.02 -4.88,10.89 -10.89,10.89 -6.03,0 -10.91,-4.87 -10.91,-10.89 0,-6.02 4.87,-10.88 10.91,-10.88 6.01,-0.01 10.89,4.86 10.89,10.88 z"
id="path4301"
style="fill:#78a3ad" /></g></g><path
style="fill:#78a3ad;fill-opacity:1"
d="m 58.330002,54.029999 12.01,0 0,7.69 -12.01,0 z"
id="rect4303" /><path
style="fill:#78a3ad;fill-opacity:1"
d="m 43.360001,56.799999 11.899999,0 0,5.03 -11.899999,0 z"
id="rect4305" /><g
id="g4307"
clip-path="none"><path
d="m 13.36,63.23 c 4.27,0 7.72,8.37 7.72,18.71 0,10.33 -3.45,18.7 -7.72,18.7 -4.26,0 -7.71,-8.38 -7.71,-18.7 0,-10.33 3.46,-18.71 7.71,-18.71 z"
id="path4309"
style="fill:#2f2f2f" /><path
d="M 13.36,101.68 C 8.45,101.68 4.61,93 4.61,81.94 4.61,70.87 8.46,62.2 13.36,62.2 c 4.92,0 8.76,8.67 8.76,19.74 0.01,11.07 -3.84,19.74 -8.76,19.74 z m 0,-37.41 c -3.15,0 -6.67,7.25 -6.67,17.67 0,10.41 3.52,17.66 6.67,17.66 3.16,0 6.68,-7.25 6.68,-17.66 0.01,-10.41 -3.51,-17.67 -6.68,-17.67 z"
id="path4311"
style="fill:#fcc21b" /></g><path
style="fill:#2f2f2f"
d="m 10.59,32.689999 35.18,0 0,2.63 -35.18,0 z"
id="rect4313" /></g></svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

64
misc/emoji_u1f682.svg Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<path fill="#ED6C30" d="M64.35,72.12c-3.31,0-5.99-2.23-5.99-4.98V53.22c0-2.74,2.68-4.97,5.99-4.97c3.3,0,5.99,2.22,5.99,4.97
v13.92C70.35,69.88,67.66,72.12,64.35,72.12z"/>
<path fill="#ED6C30" d="M49.29,75.75c-3.31,0-5.98-2.23-5.98-4.97V56.87c0-2.75,2.67-4.98,5.98-4.98s6,2.22,6,4.98v13.92
C55.28,73.52,52.59,75.75,49.29,75.75z"/>
<rect x="26.44" y="95.78" fill="#2F2F2F" width="95.41" height="15.91"/>
<rect x="13.36" y="63.23" fill="#ED6C30" width="91.81" height="37.41"/>
<rect x="77.94" y="39.58" fill="#ED6C30" width="43.92" height="61.06"/>
<g>
<path fill="#2F2F2F" d="M35.04,63.24c4.26,0,7.72,8.38,7.72,18.71c0,10.33-3.46,18.7-7.72,18.7c-4.27,0-7.73-8.37-7.73-18.7
C27.32,71.62,30.78,63.24,35.04,63.24z"/>
<path fill="#FCC21B" d="M35.04,101.69c-4.92,0-8.77-8.67-8.77-19.74c0-11.07,3.85-19.74,8.77-19.74c4.91,0,8.76,8.67,8.76,19.74
C43.8,93.02,39.95,101.69,35.04,101.69z M35.04,64.28c-3.16,0-6.69,7.26-6.69,17.67s3.53,17.66,6.69,17.66
c3.16,0,6.68-7.25,6.68-17.66S38.2,64.28,35.04,64.28z"/>
</g>
<rect x="13.79" y="63.21" fill="#2F2F2F" width="21.78" height="37.93"/>
<rect x="71.96" y="32.66" fill="#2F2F2F" width="55.89" height="6.93"/>
<polygon fill="#2F2F2F" points="35.44,63.23 20.92,63.23 11.87,33.93 44.49,33.93 "/>
<polygon fill="#2F2F2F" points="39.84,23.56 16.31,23.56 11.87,33.93 44.49,33.93 "/>
<polygon fill="#2F2F2F" points="0.15,120.19 28.67,120.19 28.67,100.64 13.36,100.64 "/>
<path fill="#FFFFFF" d="M116.51,45.55c0-1.54-1.25-2.8-2.81-2.8h-12.51c-1.56,0-2.83,1.26-2.83,2.8v21.64c0,1.55,1.27,2.8,2.83,2.8
h12.51c1.56,0,2.81-1.24,2.81-2.8V45.55z"/>
<rect x="0.15" y="114.26" fill="#2F2F2F" width="28.52" height="5.93"/>
<g>
<path fill="#78A3AD" d="M82.79,105.02c0,8.53-6.91,15.44-15.42,15.44c-8.53,0-15.45-6.91-15.45-15.44
c0-8.53,6.92-15.44,15.45-15.44C75.89,89.58,82.79,96.49,82.79,105.02z"/>
</g>
<g>
<path fill="#2F2F2F" d="M76.25,105.02c0,4.91-3.98,8.9-8.89,8.9c-4.92,0-8.91-3.98-8.91-8.9c0-4.92,3.99-8.89,8.91-8.89
C72.27,96.13,76.25,100.11,76.25,105.02z"/>
</g>
<g>
<path fill="#78A3AD" d="M113.68,105.02c0,8.53-6.91,15.44-15.43,15.44c-8.53,0-15.45-6.91-15.45-15.44
c0-8.53,6.92-15.44,15.45-15.44C106.77,89.58,113.68,96.49,113.68,105.02z"/>
</g>
<g>
<path fill="#2F2F2F" d="M107.13,105.02c0,4.91-3.98,8.9-8.9,8.9c-4.91,0-8.9-3.98-8.9-8.9c0-4.92,3.99-8.89,8.9-8.89
C103.15,96.13,107.13,100.11,107.13,105.02z"/>
</g>
<path fill="#FFFFFF" d="M70.04,104.25c-1.42,0-2.58-1.16-2.58-2.59l0,0c0-1.42,1.16-2.58,2.58-2.58h25.54
c1.42,0,2.57,1.15,2.57,2.58l0,0c0,1.43-1.15,2.59-2.57,2.59H70.04z"/>
<g>
<g>
<path fill="#78A3AD" d="M50.47,109.57c0,6.02-4.88,10.89-10.89,10.89c-6.03,0-10.91-4.87-10.91-10.89
c0-6.02,4.87-10.88,10.91-10.88C45.59,98.68,50.47,103.55,50.47,109.57z"/>
</g>
</g>
<rect x="58.33" y="54.03" fill="#FCC21B" width="12.01" height="7.69"/>
<rect x="43.36" y="56.8" fill="#FCC21B" width="11.9" height="5.03"/>
<g>
<path fill="#2F2F2F" d="M13.36,63.23c4.27,0,7.72,8.37,7.72,18.71c0,10.33-3.45,18.7-7.72,18.7c-4.26,0-7.71-8.38-7.71-18.7
C5.65,71.61,9.11,63.23,13.36,63.23z"/>
<path fill="#FCC21B" d="M13.36,101.68c-4.91,0-8.75-8.68-8.75-19.74c0-11.07,3.85-19.74,8.75-19.74c4.92,0,8.76,8.67,8.76,19.74
C22.13,93.01,18.28,101.68,13.36,101.68z M13.36,64.27c-3.15,0-6.67,7.25-6.67,17.67c0,10.41,3.52,17.66,6.67,17.66
c3.16,0,6.68-7.25,6.68-17.66C20.05,71.53,16.53,64.27,13.36,64.27z"/>
</g>
<rect x="10.59" y="32.69" fill="#2F2F2F" width="35.18" height="2.63"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

35
misc/emoji_u1f683.svg Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g>
<g>
<defs>
<path id="SVGID_1_" d="M127.38,51.82c0-7.55-4.09-14.64-22.55-14.64H75.7H52.3H23.27c-18.47,0-22.56,7.09-22.56,14.64
c0,5.69,0,11.81,0,15.57c0,0.04,0.02,0.06,0.02,0.1c-0.08,1.07-0.11,2.15-0.11,3.23c0,13.04,0,27.06,0,35.68
c0,1.81,1.45,3.26,3.26,3.26h120.24c1.8,0,3.26-1.45,3.26-3.26c0-8.62,0-22.65,0-35.68c0-0.96-0.03-1.91-0.09-2.86
c0.05-0.15,0.09-0.3,0.09-0.48C127.38,63.63,127.38,57.51,127.38,51.82z"/>
</defs>
<use xlink:href="#SVGID_1_" overflow="visible" fill="#FCC21B"/>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<rect x="-2.52" y="51.88" clip-path="url(#SVGID_2_)" fill="#F79329" width="133.89" height="30.46"/>
</g>
<g>
<path fill="#2F2F2F" d="M39,108.81c0,6.62-5.37,11.97-11.98,11.97c-6.62,0-11.99-5.36-11.99-11.97c0-6.63,5.37-11.97,11.99-11.97
C33.63,96.84,39,102.19,39,108.81z"/>
</g>
<g>
<path fill="#2F2F2F" d="M110.21,108.81c0,6.62-5.37,11.97-11.98,11.97c-6.62,0-11.99-5.36-11.99-11.97
c0-6.63,5.37-11.97,11.99-11.97C104.85,96.84,110.21,102.19,110.21,108.81z"/>
</g>
<path fill="#FFFFFF" d="M35.33,75.08c0,1.75-1.41,3.16-3.17,3.16h-10.3c-1.75,0-3.17-1.41-3.17-3.16V58.29
c0-1.75,1.42-3.17,3.17-3.17h10.3c1.75,0,3.17,1.42,3.17,3.17V75.08z M63.78,58.29c0-1.75-1.42-3.17-3.18-3.17H50.3
c-1.75,0-3.16,1.42-3.16,3.17v16.79c0,1.75,1.41,3.16,3.16,3.16H60.6c1.75,0,3.18-1.41,3.18-3.16V58.29z M86.83,58.29
c0-1.75-1.43-3.17-3.18-3.17H73.35c-1.75,0-3.17,1.42-3.17,3.17v16.79c0,1.75,1.42,3.16,3.17,3.16h10.31
c1.75,0,3.18-1.41,3.18-3.16V58.29z M109.15,58.29c0-1.75-1.41-3.17-3.18-3.17H95.67c-1.75,0-3.17,1.42-3.17,3.17v16.79
c0,1.75,1.42,3.16,3.17,3.16h10.29c1.77,0,3.18-1.41,3.18-3.16V58.29z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB