Fix some leaks + optimized layouts for 7 and 10 tablets

This commit is contained in:
Sylvain Berfini 2012-11-12 14:52:15 +01:00
parent 4fa44cc7e6
commit 6f9b8141b2
9 changed files with 245 additions and 16 deletions

View file

@ -137,7 +137,7 @@
android:id="@+id/dialer" android:id="@+id/dialer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.25" android:layout_weight="0.24"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:contentDescription="@string/content_description_dialer" android:contentDescription="@string/content_description_dialer"
android:scaleType="fitXY" android:scaleType="fitXY"

View file

@ -0,0 +1,175 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/landscape_background">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_centerInParent="true"
android:src="@drawable/background_logo"/>
<!-- Hack to adjust perfectly on every screen the bottom of the fragment with the curved menu -->
<LinearLayout
android:id="@+id/mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="bottom"
android:orientation="horizontal">
<ImageView
android:contentDescription="@string/content_description_mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:scaleType="fitEnd"
android:src="@drawable/mark"
android:visibility="invisible" />
<ImageView
android:contentDescription="@string/content_description_mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:scaleType="fitEnd"
android:src="@drawable/mark"
android:visibility="invisible" />
<ImageView
android:contentDescription="@string/content_description_mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.24"
android:scaleType="fitEnd"
android:src="@drawable/mark"
android:visibility="invisible" />
<ImageView
android:contentDescription="@string/content_description_mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:scaleType="fitEnd"
android:src="@drawable/mark"
android:visibility="invisible" />
<ImageView
android:contentDescription="@string/content_description_mark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:scaleType="fitEnd"
android:src="@drawable/mark"
android:visibility="invisible" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/mark"
android:layout_alignParentTop="true" >
<LinearLayout
android:baselineAligned="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingTop="40dp">
<LinearLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.67" />
<LinearLayout
android:id="@+id/fragmentContainer2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.33" />
</LinearLayout>
<fragment
android:id="@+id/status"
android:name="org.linphone.StatusFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/status" />
</FrameLayout>
<LinearLayout
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2">
<include layout="@layout/menu_history_button" />
<TextView
android:id="@+id/missedCalls"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/missed_calls_bg"
android:gravity="center"
android:textSize="20dp"
android:visibility="gone" />
</RelativeLayout>
<include layout="@layout/menu_contact_button" />
<ImageView
android:id="@+id/dialer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.245"
android:adjustViewBounds="true"
android:contentDescription="@string/content_description_dialer"
android:scaleType="fitXY"
android:src="@drawable/dialer" />
<include layout="@layout/menu_about_chat_button" />
<RelativeLayout
android:id="@+id/completeChat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2">
<include layout="@layout/menu_chat_button" />
<TextView
android:id="@+id/missedChats"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/missed_calls_bg"
android:gravity="center"
android:textSize="20dp"
android:visibility="gone" />
</RelativeLayout>
<include layout="@layout/menu_settings_button" />
<include layout="@layout/menu_about_settings_button" />
</LinearLayout>
</RelativeLayout>

View file

@ -117,6 +117,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private Bitmap imageToUpload; private Bitmap imageToUpload;
private Uri imageToUploadUri; private Uri imageToUploadUri;
private Thread uploadThread; private Thread uploadThread;
private TextWatcher textWatcher;
private OnGlobalLayoutListener keyboardListener;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -174,9 +176,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
} }
uploadServerUri = getActivity().getResources().getString(R.string.pref_image_sharing_server_key); uploadServerUri = getActivity().getResources().getString(R.string.pref_image_sharing_server_key);
addVirtualKeyboardVisiblityListener();
message.addTextChangedListener(new TextWatcher() { textWatcher = new TextWatcher() {
public void afterTextChanged(Editable arg0) { public void afterTextChanged(Editable arg0) {
} }
@ -193,13 +194,13 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
sendMessage.setEnabled(true); sendMessage.setEnabled(true);
} }
} }
}); };
return view; return view;
} }
private void addVirtualKeyboardVisiblityListener() { private void addVirtualKeyboardVisiblityListener() {
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { keyboardListener = new OnGlobalLayoutListener() {
@Override @Override
public void onGlobalLayout() { public void onGlobalLayout() {
Rect visibleArea = new Rect(); Rect visibleArea = new Rect();
@ -212,7 +213,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
hideKeyboardVisibleMode(); hideKeyboardVisibleMode();
} }
} }
}); };
view.getViewTreeObserver().addOnGlobalLayoutListener(keyboardListener);
}
private void removeVirtualKeyboardVisiblityListener() {
Compatibility.removeGlobalLayoutListener(view.getViewTreeObserver(), keyboardListener);
} }
public void showKeyboardVisibleMode() { public void showKeyboardVisibleMode() {
@ -357,8 +363,11 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
@Override @Override
public void onPause() { public void onPause() {
super.onPause();
latestImageMessages = null; latestImageMessages = null;
message.removeTextChangedListener(textWatcher);
removeVirtualKeyboardVisiblityListener();
super.onPause();
if (!message.getText().toString().equals("") && LinphoneActivity.isInstanciated()) { if (!message.getText().toString().equals("") && LinphoneActivity.isInstanciated()) {
ChatStorage chatStorage = LinphoneActivity.instance().getChatStorage(); ChatStorage chatStorage = LinphoneActivity.instance().getChatStorage();
@ -376,6 +385,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
@Override @Override
public void onResume() { public void onResume() {
latestImageMessages = new HashMap<Integer, String>(); latestImageMessages = new HashMap<Integer, String>();
message.addTextChangedListener(textWatcher);
addVirtualKeyboardVisiblityListener();
super.onResume(); super.onResume();
@ -643,7 +654,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
Cursor cursor = loader.loadInBackground(); Cursor cursor = loader.loadInBackground();
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
return cursor.getString(column_index); String result = cursor.getString(column_index);
cursor.close();
return result;
} }
return null; return null;
} }

View file

@ -251,7 +251,8 @@ public class ChatStorage {
c.close(); c.close();
return rawImage; return rawImage;
} }
c.close();
return null; return null;
} }

View file

@ -187,6 +187,7 @@ public final class ContactHelper {
boolean valid = checkPhotosUris(resolver, c, boolean valid = checkPhotosUris(resolver, c,
android.provider.ContactsContract.Data.CONTACT_ID, android.provider.ContactsContract.Data.CONTACT_ID,
android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
c.close();
if (valid) return true; if (valid) return true;
} }
@ -202,6 +203,7 @@ public final class ContactHelper {
boolean valid = checkPhotosUris(resolver, c, boolean valid = checkPhotosUris(resolver, c,
android.provider.ContactsContract.Data.CONTACT_ID, android.provider.ContactsContract.Data.CONTACT_ID,
android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
c.close();
if (valid) return true; if (valid) return true;
// Finally using phone number // Finally using phone number
@ -216,7 +218,7 @@ public final class ContactHelper {
android.provider.ContactsContract.PhoneLookup.NUMBER, android.provider.ContactsContract.PhoneLookup.NUMBER,
android.provider.ContactsContract.PhoneLookup.DISPLAY_NAME}; android.provider.ContactsContract.PhoneLookup.DISPLAY_NAME};
c = resolver.query(lookupUri, projection, null, null, null); c = resolver.query(lookupUri, projection, null, null, null);
while (c.moveToNext()) { while (c != null && c.moveToNext()) {
long id = c.getLong(c.getColumnIndex(android.provider.ContactsContract.PhoneLookup._ID)); long id = c.getLong(c.getColumnIndex(android.provider.ContactsContract.PhoneLookup._ID));
String enteredNumber = c.getString(c.getColumnIndex(android.provider.ContactsContract.PhoneLookup.NUMBER)); String enteredNumber = c.getString(c.getColumnIndex(android.provider.ContactsContract.PhoneLookup.NUMBER));
if (!normalizedNumber.equals(PhoneNumberUtils.getStrippedReversed(enteredNumber))) { if (!normalizedNumber.equals(PhoneNumberUtils.getStrippedReversed(enteredNumber))) {

View file

@ -351,8 +351,13 @@ public class EditContactFragment extends Fragment {
new String[]{RawContacts._ID}, new String[]{RawContacts._ID},
RawContacts.CONTACT_ID + "=?", RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null); new String[]{contactID}, null);
if (c != null && c.moveToFirst()) { if (c != null) {
return c.getString(c.getColumnIndex(RawContacts._ID)); String result = null;
if (c.moveToFirst()) {
result = c.getString(c.getColumnIndex(RawContacts._ID));
}
c.close();
return result;
} }
return null; return null;
} }
@ -362,8 +367,13 @@ public class EditContactFragment extends Fragment {
new String[]{ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME}, new String[]{ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME},
RawContacts.CONTACT_ID + "=?", RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null); new String[]{contactID}, null);
if (c != null && c.moveToFirst()) { if (c != null) {
return c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); String result = null;
if (c.moveToFirst()) {
result = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
}
c.close();
return result;
} }
return null; return null;
} }
@ -373,8 +383,13 @@ public class EditContactFragment extends Fragment {
new String[]{ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME}, new String[]{ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME},
RawContacts.CONTACT_ID + "=?", RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null); new String[]{contactID}, null);
if (c != null && c.moveToFirst()) { if (c != null) {
return c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); String result = null;
if (c.moveToFirst()) {
result = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
}
c.close();
return result;
} }
return null; return null;
} }

View file

@ -36,6 +36,8 @@ import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Intents.Insert; import android.provider.ContactsContract.Intents.Insert;
import android.text.ClipboardManager; import android.text.ClipboardManager;
import android.view.Display; import android.view.Display;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
/* /*
ApiFivePlus.java ApiFivePlus.java
@ -421,4 +423,8 @@ public class ApiFivePlus {
.build() .build()
); );
} }
public static void removeGlobalLayoutListener(ViewTreeObserver viewTreeObserver, OnGlobalLayoutListener keyboardListener) {
viewTreeObserver.removeGlobalOnLayoutListener(keyboardListener);
}
} }

View file

@ -7,6 +7,8 @@ import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
/* /*
ApiSixteenPlus.java ApiSixteenPlus.java
Copyright (C) 2012 Belledonne Communications, Grenoble, France Copyright (C) 2012 Belledonne Communications, Grenoble, France
@ -76,4 +78,8 @@ public class ApiSixteenPlus {
return notif; return notif;
} }
public static void removeGlobalLayoutListener(ViewTreeObserver viewTreeObserver, OnGlobalLayoutListener keyboardListener) {
viewTreeObserver.removeOnGlobalLayoutListener(keyboardListener);
}
} }

View file

@ -37,6 +37,8 @@ import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.preference.Preference; import android.preference.Preference;
import android.view.Display; import android.view.Display;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
/** /**
* @author Sylvain Berfini * @author Sylvain Berfini
*/ */
@ -243,4 +245,13 @@ public class Compatibility {
ApiFivePlus.deleteSipAddressFromContact(ops, oldSipAddress, contactID); ApiFivePlus.deleteSipAddressFromContact(ops, oldSipAddress, contactID);
} }
} }
public static void removeGlobalLayoutListener(ViewTreeObserver viewTreeObserver, OnGlobalLayoutListener keyboardListener) {
if (Version.sdkAboveOrEqual(16)) {
ApiSixteenPlus.removeGlobalLayoutListener(viewTreeObserver, keyboardListener);
} else {
ApiFivePlus.removeGlobalLayoutListener(viewTreeObserver, keyboardListener);
}
}
} }